From 49b02ded698c15818eb0ba3f8487f4aa7dd71e28 Mon Sep 17 00:00:00 2001 From: Vitalii Parovishnyk Date: Thu, 27 Apr 2017 15:22:38 +0300 Subject: [PATCH] Issue #6: Added Image Crop Test Added dumy for test --- .../contents.xcworkspacedata | 3 + IGRPhotoTweaks.xcodeproj/project.pbxproj | 185 +++++++++++++++--- .../CGImage+IGRPhonoTweakExtension.swift | 4 +- IGRPhotoTweaksTests/AspectRatioTests.swift | 27 +++ .../Assets.xcassets/Contents.json | 6 + .../test-image.imageset/Contents.json | 23 +++ .../test-image.imageset/test-image.png | Bin 0 -> 4583 bytes .../test-image.imageset/test-image@2x.png | Bin 0 -> 10833 bytes .../test-image.imageset/test-image@3x.png | Bin 0 -> 18293 bytes IGRPhotoTweaksTests/CornerTests.swift | 27 +++ IGRPhotoTweaksTests/CropTests.swift | 56 ++++++ IGRPhotoTweaksTests/IGRPhotoTweaksTests.swift | 27 +++ IGRPhotoTweaksTests/Info.plist | 22 +++ IGRPhotoTweaksTests/LinesTests.swift | 27 +++ IGRPhotoTweaksTests/MasksTest.swift | 27 +++ IGRPhotoTweaksTests/RotationTests.swift | 27 +++ 16 files changed, 428 insertions(+), 33 deletions(-) create mode 100644 IGRPhotoTweaksTests/AspectRatioTests.swift create mode 100644 IGRPhotoTweaksTests/Assets.xcassets/Contents.json create mode 100644 IGRPhotoTweaksTests/Assets.xcassets/test-image.imageset/Contents.json create mode 100644 IGRPhotoTweaksTests/Assets.xcassets/test-image.imageset/test-image.png create mode 100644 IGRPhotoTweaksTests/Assets.xcassets/test-image.imageset/test-image@2x.png create mode 100644 IGRPhotoTweaksTests/Assets.xcassets/test-image.imageset/test-image@3x.png create mode 100644 IGRPhotoTweaksTests/CornerTests.swift create mode 100644 IGRPhotoTweaksTests/CropTests.swift create mode 100644 IGRPhotoTweaksTests/IGRPhotoTweaksTests.swift create mode 100644 IGRPhotoTweaksTests/Info.plist create mode 100644 IGRPhotoTweaksTests/LinesTests.swift create mode 100644 IGRPhotoTweaksTests/MasksTest.swift create mode 100644 IGRPhotoTweaksTests/RotationTests.swift diff --git a/Example/Example.xcworkspace/contents.xcworkspacedata b/Example/Example.xcworkspace/contents.xcworkspacedata index a37cf19..809fb36 100644 --- a/Example/Example.xcworkspace/contents.xcworkspacedata +++ b/Example/Example.xcworkspace/contents.xcworkspacedata @@ -1,6 +1,9 @@ + + diff --git a/IGRPhotoTweaks.xcodeproj/project.pbxproj b/IGRPhotoTweaks.xcodeproj/project.pbxproj index 6ed4bc8..d6c7271 100644 --- a/IGRPhotoTweaks.xcodeproj/project.pbxproj +++ b/IGRPhotoTweaks.xcodeproj/project.pbxproj @@ -7,6 +7,15 @@ objects = { /* Begin PBXBuildFile section */ + A5CD58D71EB2089500238BC6 /* IGRPhotoTweaksTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5CD58D61EB2089500238BC6 /* IGRPhotoTweaksTests.swift */; }; + A5CD58D91EB2089500238BC6 /* IGRPhotoTweaks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A5FE19761E4F8D5600EA6F73 /* IGRPhotoTweaks.framework */; }; + A5CD58E21EB2099600238BC6 /* LinesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5CD58E11EB2099600238BC6 /* LinesTests.swift */; }; + A5CD58E41EB209AA00238BC6 /* CornerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5CD58E31EB209AA00238BC6 /* CornerTests.swift */; }; + A5CD58E61EB209CE00238BC6 /* MasksTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5CD58E51EB209CE00238BC6 /* MasksTest.swift */; }; + A5CD58E81EB209E100238BC6 /* CropTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5CD58E71EB209E100238BC6 /* CropTests.swift */; }; + A5CD58EA1EB209F100238BC6 /* RotationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5CD58E91EB209F100238BC6 /* RotationTests.swift */; }; + A5CD58EC1EB20A0100238BC6 /* AspectRatioTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5CD58EB1EB20A0100238BC6 /* AspectRatioTests.swift */; }; + A5CD58F01EB20F7300238BC6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A5CD58EF1EB20F7300238BC6 /* Assets.xcassets */; }; A5FE197A1E4F8D5700EA6F73 /* IGRPhotoTweaks.h in Headers */ = {isa = PBXBuildFile; fileRef = A5FE19781E4F8D5700EA6F73 /* IGRPhotoTweaks.h */; settings = {ATTRIBUTES = (Public, ); }; }; A5FF6BF71EB11586003F6108 /* CGFloat+IGRPhonoTweakExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5FF6BCF1EB11586003F6108 /* CGFloat+IGRPhonoTweakExtension.swift */; }; A5FF6BF81EB11586003F6108 /* CGImage+IGRPhonoTweakExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5FF6BD01EB11586003F6108 /* CGImage+IGRPhonoTweakExtension.swift */; }; @@ -43,10 +52,27 @@ A5FF6C171EB11586003F6108 /* IGRPhotoScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5FF6BF61EB11586003F6108 /* IGRPhotoScrollView.swift */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + A5CD58DA1EB2089500238BC6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A5DFB1AA1E481F48009ACD31 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A5FE19751E4F8D5600EA6F73; + remoteInfo = IGRPhotoTweaks; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXFileReference section */ - A5DFB1CC1E481FE4009ACD31 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - A5DFB1CE1E481FE4009ACD31 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - A5DFB1D01E481FE4009ACD31 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + A5CD58D41EB2089500238BC6 /* IGRPhotoTweaksTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IGRPhotoTweaksTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + A5CD58D61EB2089500238BC6 /* IGRPhotoTweaksTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IGRPhotoTweaksTests.swift; sourceTree = ""; }; + A5CD58D81EB2089500238BC6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A5CD58E11EB2099600238BC6 /* LinesTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LinesTests.swift; sourceTree = ""; }; + A5CD58E31EB209AA00238BC6 /* CornerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CornerTests.swift; sourceTree = ""; }; + A5CD58E51EB209CE00238BC6 /* MasksTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MasksTest.swift; sourceTree = ""; }; + A5CD58E71EB209E100238BC6 /* CropTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CropTests.swift; sourceTree = ""; }; + A5CD58E91EB209F100238BC6 /* RotationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RotationTests.swift; sourceTree = ""; }; + A5CD58EB1EB20A0100238BC6 /* AspectRatioTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AspectRatioTests.swift; sourceTree = ""; }; + A5CD58EF1EB20F7300238BC6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; A5DFB1D21E481FE4009ACD31 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; A5FE19761E4F8D5600EA6F73 /* IGRPhotoTweaks.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IGRPhotoTweaks.framework; sourceTree = BUILT_PRODUCTS_DIR; }; A5FE19781E4F8D5700EA6F73 /* IGRPhotoTweaks.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IGRPhotoTweaks.h; sourceTree = ""; }; @@ -86,6 +112,14 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + A5CD58D11EB2089500238BC6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A5CD58D91EB2089500238BC6 /* IGRPhotoTweaks.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; A5FE19721E4F8D5600EA6F73 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -96,12 +130,28 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + A5CD58D51EB2089500238BC6 /* IGRPhotoTweaksTests */ = { + isa = PBXGroup; + children = ( + A5CD58D61EB2089500238BC6 /* IGRPhotoTweaksTests.swift */, + A5CD58E11EB2099600238BC6 /* LinesTests.swift */, + A5CD58E31EB209AA00238BC6 /* CornerTests.swift */, + A5CD58E51EB209CE00238BC6 /* MasksTest.swift */, + A5CD58E71EB209E100238BC6 /* CropTests.swift */, + A5CD58E91EB209F100238BC6 /* RotationTests.swift */, + A5CD58EB1EB20A0100238BC6 /* AspectRatioTests.swift */, + A5CD58D81EB2089500238BC6 /* Info.plist */, + A5CD58EF1EB20F7300238BC6 /* Assets.xcassets */, + ); + path = IGRPhotoTweaksTests; + sourceTree = ""; + }; A5DFB1A91E481F48009ACD31 = { isa = PBXGroup; children = ( A5DFB1CA1E481FE4009ACD31 /* IGRPhotoTweaks */, - A5DFB1CB1E481FE4009ACD31 /* Resources */, A5DFB1D11E481FE4009ACD31 /* Settings */, + A5CD58D51EB2089500238BC6 /* IGRPhotoTweaksTests */, A5DFB1B31E481F48009ACD31 /* Products */, ); sourceTree = ""; @@ -110,6 +160,7 @@ isa = PBXGroup; children = ( A5FE19761E4F8D5600EA6F73 /* IGRPhotoTweaks.framework */, + A5CD58D41EB2089500238BC6 /* IGRPhotoTweaksTests.xctest */, ); name = Products; sourceTree = ""; @@ -131,16 +182,6 @@ path = IGRPhotoTweaks; sourceTree = ""; }; - A5DFB1CB1E481FE4009ACD31 /* Resources */ = { - isa = PBXGroup; - children = ( - A5DFB1CC1E481FE4009ACD31 /* Assets.xcassets */, - A5DFB1CD1E481FE4009ACD31 /* LaunchScreen.storyboard */, - A5DFB1CF1E481FE4009ACD31 /* Main.storyboard */, - ); - path = Resources; - sourceTree = ""; - }; A5DFB1D11E481FE4009ACD31 /* Settings */ = { isa = PBXGroup; children = ( @@ -251,6 +292,24 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + A5CD58D31EB2089500238BC6 /* IGRPhotoTweaksTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = A5CD58DC1EB2089500238BC6 /* Build configuration list for PBXNativeTarget "IGRPhotoTweaksTests" */; + buildPhases = ( + A5CD58D01EB2089500238BC6 /* Sources */, + A5CD58D11EB2089500238BC6 /* Frameworks */, + A5CD58D21EB2089500238BC6 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + A5CD58DB1EB2089500238BC6 /* PBXTargetDependency */, + ); + name = IGRPhotoTweaksTests; + productName = IGRPhotoTweaksTests; + productReference = A5CD58D41EB2089500238BC6 /* IGRPhotoTweaksTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; A5FE19751E4F8D5600EA6F73 /* IGRPhotoTweaks */ = { isa = PBXNativeTarget; buildConfigurationList = A5FE197B1E4F8D5700EA6F73 /* Build configuration list for PBXNativeTarget "IGRPhotoTweaks" */; @@ -276,10 +335,15 @@ isa = PBXProject; attributes = { CLASSPREFIX = IGR; - LastSwiftUpdateCheck = 0820; + LastSwiftUpdateCheck = 0830; LastUpgradeCheck = 0820; ORGANIZATIONNAME = "IGR Software"; TargetAttributes = { + A5CD58D31EB2089500238BC6 = { + CreatedOnToolsVersion = 8.3.2; + DevelopmentTeam = DMP42GVPJ3; + ProvisioningStyle = Automatic; + }; A5FE19751E4F8D5600EA6F73 = { CreatedOnToolsVersion = 8.2.1; DevelopmentTeam = DMP42GVPJ3; @@ -302,11 +366,20 @@ projectRoot = ""; targets = ( A5FE19751E4F8D5600EA6F73 /* IGRPhotoTweaks */, + A5CD58D31EB2089500238BC6 /* IGRPhotoTweaksTests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + A5CD58D21EB2089500238BC6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A5CD58F01EB20F7300238BC6 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; A5FE19741E4F8D5600EA6F73 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -317,6 +390,20 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + A5CD58D01EB2089500238BC6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A5CD58D71EB2089500238BC6 /* IGRPhotoTweaksTests.swift in Sources */, + A5CD58E81EB209E100238BC6 /* CropTests.swift in Sources */, + A5CD58EC1EB20A0100238BC6 /* AspectRatioTests.swift in Sources */, + A5CD58E61EB209CE00238BC6 /* MasksTest.swift in Sources */, + A5CD58E21EB2099600238BC6 /* LinesTests.swift in Sources */, + A5CD58E41EB209AA00238BC6 /* CornerTests.swift in Sources */, + A5CD58EA1EB209F100238BC6 /* RotationTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; A5FE19711E4F8D5600EA6F73 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -359,26 +446,51 @@ }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXVariantGroup section */ - A5DFB1CD1E481FE4009ACD31 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - A5DFB1CE1E481FE4009ACD31 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; +/* Begin PBXTargetDependency section */ + A5CD58DB1EB2089500238BC6 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A5FE19751E4F8D5600EA6F73 /* IGRPhotoTweaks */; + targetProxy = A5CD58DA1EB2089500238BC6 /* PBXContainerItemProxy */; }; - A5DFB1CF1E481FE4009ACD31 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - A5DFB1D01E481FE4009ACD31 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ +/* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ + A5CD58DD1EB2089500238BC6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = DMP42GVPJ3; + GCC_C_LANGUAGE_STANDARD = gnu99; + INFOPLIST_FILE = IGRPhotoTweaksTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.igrsoft.IGRPhotoTweaksTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + A5CD58DE1EB2089500238BC6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = DMP42GVPJ3; + GCC_C_LANGUAGE_STANDARD = gnu99; + INFOPLIST_FILE = IGRPhotoTweaksTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.igrsoft.IGRPhotoTweaksTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; A5DFB1C21E481F48009ACD31 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -510,6 +622,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + A5CD58DC1EB2089500238BC6 /* Build configuration list for PBXNativeTarget "IGRPhotoTweaksTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A5CD58DD1EB2089500238BC6 /* Debug */, + A5CD58DE1EB2089500238BC6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; A5DFB1AD1E481F48009ACD31 /* Build configuration list for PBXProject "IGRPhotoTweaks" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/IGRPhotoTweaks/Category/CGImage+IGRPhonoTweakExtension.swift b/IGRPhotoTweaks/Category/CGImage+IGRPhonoTweakExtension.swift index defa188..3a4f130 100644 --- a/IGRPhotoTweaks/Category/CGImage+IGRPhonoTweakExtension.swift +++ b/IGRPhotoTweaks/Category/CGImage+IGRPhonoTweakExtension.swift @@ -42,6 +42,8 @@ extension CGImage { width: imageViewSize.width, height: imageViewSize.height)) - return context!.makeImage()! + let result = context!.makeImage()! + + return result } } diff --git a/IGRPhotoTweaksTests/AspectRatioTests.swift b/IGRPhotoTweaksTests/AspectRatioTests.swift new file mode 100644 index 0000000..ed882b7 --- /dev/null +++ b/IGRPhotoTweaksTests/AspectRatioTests.swift @@ -0,0 +1,27 @@ +// +// AspectRatioTests.swift +// IGRPhotoTweaks +// +// Created by Vitalii Parovishnyk on 4/27/17. +// Copyright © 2017 IGR Software. All rights reserved. +// + +import XCTest +import IGRPhotoTweaks + +class AspectRatioTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testDumy() { + + } +} diff --git a/IGRPhotoTweaksTests/Assets.xcassets/Contents.json b/IGRPhotoTweaksTests/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/IGRPhotoTweaksTests/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/IGRPhotoTweaksTests/Assets.xcassets/test-image.imageset/Contents.json b/IGRPhotoTweaksTests/Assets.xcassets/test-image.imageset/Contents.json new file mode 100644 index 0000000..6c6bcb6 --- /dev/null +++ b/IGRPhotoTweaksTests/Assets.xcassets/test-image.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "test-image.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "test-image@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "test-image@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/IGRPhotoTweaksTests/Assets.xcassets/test-image.imageset/test-image.png b/IGRPhotoTweaksTests/Assets.xcassets/test-image.imageset/test-image.png new file mode 100644 index 0000000000000000000000000000000000000000..9d6acf827adf0800f821c0701b7503a8614e2891 GIT binary patch literal 4583 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 literal 0 HcmV?d00001 diff --git a/IGRPhotoTweaksTests/Assets.xcassets/test-image.imageset/test-image@3x.png b/IGRPhotoTweaksTests/Assets.xcassets/test-image.imageset/test-image@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..1b18a3e385ac0ddf4cae621931a07152495eab06 GIT binary patch literal 18293 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 UIImage? in + let bundle = Bundle(for: IGRPhotoTweaksTests.self) + return UIImage(named: "test-image", in: bundle, compatibleWith: nil) + } + + let originalImageSize = CGSize(width: 100, height: 56) + let cropImageSize = CGSize(width: 50, height: 25) + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + + + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testImageCrop() { + let image = testImage() + + XCTAssertNotNil(image) + + if let fixedImage = image?.cgImageWithFixedOrientation() { + let imageRef = fixedImage.transformedImage(CGAffineTransform.identity, + sourceSize: originalImageSize, + outputWidth: originalImageSize.width, + cropSize: cropImageSize, + imageViewSize: originalImageSize) + + let resultImage = UIImage(cgImage: imageRef, scale: 2.0, orientation: .up) + + XCTAssertNotNil(resultImage, "Can't crop image") + XCTAssert(resultImage.size.equalTo(cropImageSize), "Wrong crop size") + + } else { + XCTAssert(false, "Can't fix Image") + } + } +} diff --git a/IGRPhotoTweaksTests/IGRPhotoTweaksTests.swift b/IGRPhotoTweaksTests/IGRPhotoTweaksTests.swift new file mode 100644 index 0000000..6887418 --- /dev/null +++ b/IGRPhotoTweaksTests/IGRPhotoTweaksTests.swift @@ -0,0 +1,27 @@ +// +// IGRPhotoTweaksTests.swift +// IGRPhotoTweaksTests +// +// Created by Vitalii Parovishnyk on 4/27/17. +// Copyright © 2017 IGR Software. All rights reserved. +// + +import XCTest +import IGRPhotoTweaks + +class IGRPhotoTweaksTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testDumy() { + + } +} diff --git a/IGRPhotoTweaksTests/Info.plist b/IGRPhotoTweaksTests/Info.plist new file mode 100644 index 0000000..6c6c23c --- /dev/null +++ b/IGRPhotoTweaksTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/IGRPhotoTweaksTests/LinesTests.swift b/IGRPhotoTweaksTests/LinesTests.swift new file mode 100644 index 0000000..dcd6d7b --- /dev/null +++ b/IGRPhotoTweaksTests/LinesTests.swift @@ -0,0 +1,27 @@ +// +// LinesTests.swift +// IGRPhotoTweaks +// +// Created by Vitalii Parovishnyk on 4/27/17. +// Copyright © 2017 IGR Software. All rights reserved. +// + +import XCTest +import IGRPhotoTweaks + +class LinesTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testDumy() { + + } +} diff --git a/IGRPhotoTweaksTests/MasksTest.swift b/IGRPhotoTweaksTests/MasksTest.swift new file mode 100644 index 0000000..2146d2a --- /dev/null +++ b/IGRPhotoTweaksTests/MasksTest.swift @@ -0,0 +1,27 @@ +// +// MasksTest.swift +// IGRPhotoTweaks +// +// Created by Vitalii Parovishnyk on 4/27/17. +// Copyright © 2017 IGR Software. All rights reserved. +// + +import XCTest +import IGRPhotoTweaks + +class MasksTest: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testDumy() { + + } +} diff --git a/IGRPhotoTweaksTests/RotationTests.swift b/IGRPhotoTweaksTests/RotationTests.swift new file mode 100644 index 0000000..4568159 --- /dev/null +++ b/IGRPhotoTweaksTests/RotationTests.swift @@ -0,0 +1,27 @@ +// +// RotationTests.swift +// IGRPhotoTweaks +// +// Created by Vitalii Parovishnyk on 4/27/17. +// Copyright © 2017 IGR Software. All rights reserved. +// + +import XCTest +import IGRPhotoTweaks + +class RotationTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testDumy() { + + } +}