diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..dc113b6 Binary files /dev/null and b/.DS_Store differ diff --git a/FizzBuzz.xcodeproj/project.pbxproj b/FizzBuzz.xcodeproj/project.pbxproj new file mode 100644 index 0000000..3fafa0f --- /dev/null +++ b/FizzBuzz.xcodeproj/project.pbxproj @@ -0,0 +1,530 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1CA324691D708FEC001E7A20 /* ViewControllerUnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CA324681D708FEC001E7A20 /* ViewControllerUnitTests.swift */; }; + 1CA3246D1D70A23A001E7A20 /* Game.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CDE16681D30421D00E75269 /* Game.swift */; }; + 1CA3246F1D70A270001E7A20 /* Brain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CBA38FE1D2EBA7D00175B34 /* Brain.swift */; }; + 1CA324711D74C209001E7A20 /* ViewControllerUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CA324701D74C209001E7A20 /* ViewControllerUITests.swift */; }; + 1CA324751D75DC75001E7A20 /* Move.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CA324741D75DC75001E7A20 /* Move.swift */; }; + 1CBA38D11D2EB9C100175B34 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CBA38D01D2EB9C100175B34 /* AppDelegate.swift */; }; + 1CBA38D31D2EB9C100175B34 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CBA38D21D2EB9C100175B34 /* ViewController.swift */; }; + 1CBA38D61D2EB9C100175B34 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1CBA38D41D2EB9C100175B34 /* Main.storyboard */; }; + 1CBA38D81D2EB9C100175B34 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1CBA38D71D2EB9C100175B34 /* Assets.xcassets */; }; + 1CBA38DB1D2EB9C100175B34 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1CBA38D91D2EB9C100175B34 /* LaunchScreen.storyboard */; }; + 1CBA38E61D2EB9C100175B34 /* BrainTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CBA38E51D2EB9C100175B34 /* BrainTests.swift */; }; + 1CDE16671D3041A900E75269 /* GameTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CDE16651D3041A900E75269 /* GameTests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 1CBA38E21D2EB9C100175B34 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 1CBA38C51D2EB9C100175B34 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1CBA38CC1D2EB9C100175B34; + remoteInfo = FizzBuzz; + }; + 1CBA38ED1D2EB9C100175B34 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 1CBA38C51D2EB9C100175B34 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1CBA38CC1D2EB9C100175B34; + remoteInfo = FizzBuzz; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 1CA324681D708FEC001E7A20 /* ViewControllerUnitTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewControllerUnitTests.swift; sourceTree = ""; }; + 1CA324701D74C209001E7A20 /* ViewControllerUITests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewControllerUITests.swift; sourceTree = ""; }; + 1CA324741D75DC75001E7A20 /* Move.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Move.swift; sourceTree = ""; }; + 1CBA38CD1D2EB9C100175B34 /* FizzBuzz.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FizzBuzz.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 1CBA38D01D2EB9C100175B34 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 1CBA38D21D2EB9C100175B34 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 1CBA38D51D2EB9C100175B34 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 1CBA38D71D2EB9C100175B34 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 1CBA38DA1D2EB9C100175B34 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 1CBA38DC1D2EB9C100175B34 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1CBA38E11D2EB9C100175B34 /* FizzBuzzTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FizzBuzzTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 1CBA38E51D2EB9C100175B34 /* BrainTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrainTests.swift; sourceTree = ""; }; + 1CBA38E71D2EB9C100175B34 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1CBA38EC1D2EB9C100175B34 /* FizzBuzzUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FizzBuzzUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 1CBA38F21D2EB9C100175B34 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1CBA38FE1D2EBA7D00175B34 /* Brain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Brain.swift; sourceTree = ""; }; + 1CDE16651D3041A900E75269 /* GameTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameTests.swift; sourceTree = ""; }; + 1CDE16681D30421D00E75269 /* Game.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Game.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 1CBA38CA1D2EB9C100175B34 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1CBA38DE1D2EB9C100175B34 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1CBA38E91D2EB9C100175B34 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1CBA38C41D2EB9C100175B34 = { + isa = PBXGroup; + children = ( + 1CBA38CF1D2EB9C100175B34 /* FizzBuzz */, + 1CBA38E41D2EB9C100175B34 /* FizzBuzzTests */, + 1CBA38EF1D2EB9C100175B34 /* FizzBuzzUITests */, + 1CBA38CE1D2EB9C100175B34 /* Products */, + ); + sourceTree = ""; + }; + 1CBA38CE1D2EB9C100175B34 /* Products */ = { + isa = PBXGroup; + children = ( + 1CBA38CD1D2EB9C100175B34 /* FizzBuzz.app */, + 1CBA38E11D2EB9C100175B34 /* FizzBuzzTests.xctest */, + 1CBA38EC1D2EB9C100175B34 /* FizzBuzzUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 1CBA38CF1D2EB9C100175B34 /* FizzBuzz */ = { + isa = PBXGroup; + children = ( + 1CBA38D01D2EB9C100175B34 /* AppDelegate.swift */, + 1CBA38D21D2EB9C100175B34 /* ViewController.swift */, + 1CBA38D41D2EB9C100175B34 /* Main.storyboard */, + 1CBA38D71D2EB9C100175B34 /* Assets.xcassets */, + 1CBA38D91D2EB9C100175B34 /* LaunchScreen.storyboard */, + 1CBA38DC1D2EB9C100175B34 /* Info.plist */, + 1CBA38FE1D2EBA7D00175B34 /* Brain.swift */, + 1CDE16681D30421D00E75269 /* Game.swift */, + 1CA324741D75DC75001E7A20 /* Move.swift */, + ); + path = FizzBuzz; + sourceTree = ""; + }; + 1CBA38E41D2EB9C100175B34 /* FizzBuzzTests */ = { + isa = PBXGroup; + children = ( + 1CBA38E51D2EB9C100175B34 /* BrainTests.swift */, + 1CBA38E71D2EB9C100175B34 /* Info.plist */, + 1CDE16651D3041A900E75269 /* GameTests.swift */, + 1CA324681D708FEC001E7A20 /* ViewControllerUnitTests.swift */, + ); + path = FizzBuzzTests; + sourceTree = ""; + }; + 1CBA38EF1D2EB9C100175B34 /* FizzBuzzUITests */ = { + isa = PBXGroup; + children = ( + 1CBA38F21D2EB9C100175B34 /* Info.plist */, + 1CA324701D74C209001E7A20 /* ViewControllerUITests.swift */, + ); + path = FizzBuzzUITests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 1CBA38CC1D2EB9C100175B34 /* FizzBuzz */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1CBA38F51D2EB9C100175B34 /* Build configuration list for PBXNativeTarget "FizzBuzz" */; + buildPhases = ( + 1CBA38C91D2EB9C100175B34 /* Sources */, + 1CBA38CA1D2EB9C100175B34 /* Frameworks */, + 1CBA38CB1D2EB9C100175B34 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = FizzBuzz; + productName = FizzBuzz; + productReference = 1CBA38CD1D2EB9C100175B34 /* FizzBuzz.app */; + productType = "com.apple.product-type.application"; + }; + 1CBA38E01D2EB9C100175B34 /* FizzBuzzTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1CBA38F81D2EB9C100175B34 /* Build configuration list for PBXNativeTarget "FizzBuzzTests" */; + buildPhases = ( + 1CBA38DD1D2EB9C100175B34 /* Sources */, + 1CBA38DE1D2EB9C100175B34 /* Frameworks */, + 1CBA38DF1D2EB9C100175B34 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 1CBA38E31D2EB9C100175B34 /* PBXTargetDependency */, + ); + name = FizzBuzzTests; + productName = FizzBuzzTests; + productReference = 1CBA38E11D2EB9C100175B34 /* FizzBuzzTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 1CBA38EB1D2EB9C100175B34 /* FizzBuzzUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1CBA38FB1D2EB9C100175B34 /* Build configuration list for PBXNativeTarget "FizzBuzzUITests" */; + buildPhases = ( + 1CBA38E81D2EB9C100175B34 /* Sources */, + 1CBA38E91D2EB9C100175B34 /* Frameworks */, + 1CBA38EA1D2EB9C100175B34 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 1CBA38EE1D2EB9C100175B34 /* PBXTargetDependency */, + ); + name = FizzBuzzUITests; + productName = FizzBuzzUITests; + productReference = 1CBA38EC1D2EB9C100175B34 /* FizzBuzzUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 1CBA38C51D2EB9C100175B34 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0730; + LastUpgradeCheck = 0730; + ORGANIZATIONNAME = "Steve Bement"; + TargetAttributes = { + 1CBA38CC1D2EB9C100175B34 = { + CreatedOnToolsVersion = 7.3.1; + }; + 1CBA38E01D2EB9C100175B34 = { + CreatedOnToolsVersion = 7.3.1; + TestTargetID = 1CBA38CC1D2EB9C100175B34; + }; + 1CBA38EB1D2EB9C100175B34 = { + CreatedOnToolsVersion = 7.3.1; + TestTargetID = 1CBA38CC1D2EB9C100175B34; + }; + }; + }; + buildConfigurationList = 1CBA38C81D2EB9C100175B34 /* Build configuration list for PBXProject "FizzBuzz" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 1CBA38C41D2EB9C100175B34; + productRefGroup = 1CBA38CE1D2EB9C100175B34 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 1CBA38CC1D2EB9C100175B34 /* FizzBuzz */, + 1CBA38E01D2EB9C100175B34 /* FizzBuzzTests */, + 1CBA38EB1D2EB9C100175B34 /* FizzBuzzUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 1CBA38CB1D2EB9C100175B34 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1CBA38DB1D2EB9C100175B34 /* LaunchScreen.storyboard in Resources */, + 1CBA38D81D2EB9C100175B34 /* Assets.xcassets in Resources */, + 1CBA38D61D2EB9C100175B34 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1CBA38DF1D2EB9C100175B34 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1CBA38EA1D2EB9C100175B34 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 1CBA38C91D2EB9C100175B34 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1CA324751D75DC75001E7A20 /* Move.swift in Sources */, + 1CBA38D31D2EB9C100175B34 /* ViewController.swift in Sources */, + 1CA3246D1D70A23A001E7A20 /* Game.swift in Sources */, + 1CA3246F1D70A270001E7A20 /* Brain.swift in Sources */, + 1CBA38D11D2EB9C100175B34 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1CBA38DD1D2EB9C100175B34 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1CBA38E61D2EB9C100175B34 /* BrainTests.swift in Sources */, + 1CA324691D708FEC001E7A20 /* ViewControllerUnitTests.swift in Sources */, + 1CDE16671D3041A900E75269 /* GameTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1CBA38E81D2EB9C100175B34 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1CA324711D74C209001E7A20 /* ViewControllerUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 1CBA38E31D2EB9C100175B34 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1CBA38CC1D2EB9C100175B34 /* FizzBuzz */; + targetProxy = 1CBA38E21D2EB9C100175B34 /* PBXContainerItemProxy */; + }; + 1CBA38EE1D2EB9C100175B34 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1CBA38CC1D2EB9C100175B34 /* FizzBuzz */; + targetProxy = 1CBA38ED1D2EB9C100175B34 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 1CBA38D41D2EB9C100175B34 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 1CBA38D51D2EB9C100175B34 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 1CBA38D91D2EB9C100175B34 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 1CBA38DA1D2EB9C100175B34 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 1CBA38F31D2EB9C100175B34 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 1CBA38F41D2EB9C100175B34 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 1CBA38F61D2EB9C100175B34 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = FizzBuzz/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.bemental.FizzBuzz; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 1CBA38F71D2EB9C100175B34 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = FizzBuzz/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.bemental.FizzBuzz; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 1CBA38F91D2EB9C100175B34 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = FizzBuzzTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.bemental.FizzBuzzTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/FizzBuzz.app/FizzBuzz"; + }; + name = Debug; + }; + 1CBA38FA1D2EB9C100175B34 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = FizzBuzzTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.bemental.FizzBuzzTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/FizzBuzz.app/FizzBuzz"; + }; + name = Release; + }; + 1CBA38FC1D2EB9C100175B34 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = FizzBuzzUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.bemental.FizzBuzzUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = FizzBuzz; + }; + name = Debug; + }; + 1CBA38FD1D2EB9C100175B34 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = FizzBuzzUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.bemental.FizzBuzzUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = FizzBuzz; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1CBA38C81D2EB9C100175B34 /* Build configuration list for PBXProject "FizzBuzz" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1CBA38F31D2EB9C100175B34 /* Debug */, + 1CBA38F41D2EB9C100175B34 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1CBA38F51D2EB9C100175B34 /* Build configuration list for PBXNativeTarget "FizzBuzz" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1CBA38F61D2EB9C100175B34 /* Debug */, + 1CBA38F71D2EB9C100175B34 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1CBA38F81D2EB9C100175B34 /* Build configuration list for PBXNativeTarget "FizzBuzzTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1CBA38F91D2EB9C100175B34 /* Debug */, + 1CBA38FA1D2EB9C100175B34 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1CBA38FB1D2EB9C100175B34 /* Build configuration list for PBXNativeTarget "FizzBuzzUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1CBA38FC1D2EB9C100175B34 /* Debug */, + 1CBA38FD1D2EB9C100175B34 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 1CBA38C51D2EB9C100175B34 /* Project object */; +} diff --git a/FizzBuzz.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/FizzBuzz.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..f20588a --- /dev/null +++ b/FizzBuzz.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/FizzBuzz/AppDelegate.swift b/FizzBuzz/AppDelegate.swift new file mode 100644 index 0000000..b13fc8c --- /dev/null +++ b/FizzBuzz/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// FizzBuzz +// +// Created by Steve Bement on 7/7/16. +// Copyright © 2016 Steve Bement. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(application: UIApplication) { + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/FizzBuzz/Assets.xcassets/AppIcon.appiconset/Contents.json b/FizzBuzz/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..eeea76c --- /dev/null +++ b/FizzBuzz/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,73 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/FizzBuzz/Assets.xcassets/Contents.json b/FizzBuzz/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/FizzBuzz/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/FizzBuzz/Assets.xcassets/button_border.imageset/Contents.json b/FizzBuzz/Assets.xcassets/button_border.imageset/Contents.json new file mode 100644 index 0000000..8de85f0 --- /dev/null +++ b/FizzBuzz/Assets.xcassets/button_border.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "button_border.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/FizzBuzz/Assets.xcassets/button_border.imageset/button_border.png b/FizzBuzz/Assets.xcassets/button_border.imageset/button_border.png new file mode 100644 index 0000000..1701bda Binary files /dev/null and b/FizzBuzz/Assets.xcassets/button_border.imageset/button_border.png differ diff --git a/FizzBuzz/Assets.xcassets/champagne.imageset/Contents.json b/FizzBuzz/Assets.xcassets/champagne.imageset/Contents.json new file mode 100644 index 0000000..c315c73 --- /dev/null +++ b/FizzBuzz/Assets.xcassets/champagne.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "champagne80.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "champagne100.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "champagne200.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/FizzBuzz/Assets.xcassets/champagne.imageset/champagne100.png b/FizzBuzz/Assets.xcassets/champagne.imageset/champagne100.png new file mode 100644 index 0000000..446dddf Binary files /dev/null and b/FizzBuzz/Assets.xcassets/champagne.imageset/champagne100.png differ diff --git a/FizzBuzz/Assets.xcassets/champagne.imageset/champagne200.png b/FizzBuzz/Assets.xcassets/champagne.imageset/champagne200.png new file mode 100644 index 0000000..8174d52 Binary files /dev/null and b/FizzBuzz/Assets.xcassets/champagne.imageset/champagne200.png differ diff --git a/FizzBuzz/Assets.xcassets/champagne.imageset/champagne80.png b/FizzBuzz/Assets.xcassets/champagne.imageset/champagne80.png new file mode 100644 index 0000000..788cef4 Binary files /dev/null and b/FizzBuzz/Assets.xcassets/champagne.imageset/champagne80.png differ diff --git a/FizzBuzz/Assets.xcassets/lightning.imageset/Contents.json b/FizzBuzz/Assets.xcassets/lightning.imageset/Contents.json new file mode 100644 index 0000000..3143b6e --- /dev/null +++ b/FizzBuzz/Assets.xcassets/lightning.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "lightning80.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "lightning100.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "lightning200.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/FizzBuzz/Assets.xcassets/lightning.imageset/lightning100.png b/FizzBuzz/Assets.xcassets/lightning.imageset/lightning100.png new file mode 100644 index 0000000..1e6cebb Binary files /dev/null and b/FizzBuzz/Assets.xcassets/lightning.imageset/lightning100.png differ diff --git a/FizzBuzz/Assets.xcassets/lightning.imageset/lightning200.png b/FizzBuzz/Assets.xcassets/lightning.imageset/lightning200.png new file mode 100644 index 0000000..a1a1d22 Binary files /dev/null and b/FizzBuzz/Assets.xcassets/lightning.imageset/lightning200.png differ diff --git a/FizzBuzz/Assets.xcassets/lightning.imageset/lightning80.png b/FizzBuzz/Assets.xcassets/lightning.imageset/lightning80.png new file mode 100644 index 0000000..0cc29a2 Binary files /dev/null and b/FizzBuzz/Assets.xcassets/lightning.imageset/lightning80.png differ diff --git a/FizzBuzz/Assets.xcassets/space.imageset/Contents.json b/FizzBuzz/Assets.xcassets/space.imageset/Contents.json new file mode 100644 index 0000000..207ada2 --- /dev/null +++ b/FizzBuzz/Assets.xcassets/space.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "space80.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "space100.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "space200.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/FizzBuzz/Assets.xcassets/space.imageset/space100.png b/FizzBuzz/Assets.xcassets/space.imageset/space100.png new file mode 100644 index 0000000..be49488 Binary files /dev/null and b/FizzBuzz/Assets.xcassets/space.imageset/space100.png differ diff --git a/FizzBuzz/Assets.xcassets/space.imageset/space200.png b/FizzBuzz/Assets.xcassets/space.imageset/space200.png new file mode 100644 index 0000000..3f8cebc Binary files /dev/null and b/FizzBuzz/Assets.xcassets/space.imageset/space200.png differ diff --git a/FizzBuzz/Assets.xcassets/space.imageset/space80.png b/FizzBuzz/Assets.xcassets/space.imageset/space80.png new file mode 100644 index 0000000..abee027 Binary files /dev/null and b/FizzBuzz/Assets.xcassets/space.imageset/space80.png differ diff --git a/FizzBuzz/Base.lproj/LaunchScreen.storyboard b/FizzBuzz/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..2e721e1 --- /dev/null +++ b/FizzBuzz/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FizzBuzz/Base.lproj/Main.storyboard b/FizzBuzz/Base.lproj/Main.storyboard new file mode 100644 index 0000000..d9f8d62 --- /dev/null +++ b/FizzBuzz/Base.lproj/Main.storyboard @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FizzBuzz/Brain.swift b/FizzBuzz/Brain.swift new file mode 100644 index 0000000..47d47c0 --- /dev/null +++ b/FizzBuzz/Brain.swift @@ -0,0 +1,42 @@ +class Brain +{ + func check(number: Int) -> Move + { + if isDivisibleByFifteen(number: number) + { + return Move.FizzBuzz + } + else if isDivisibleByThree(number: number) + { + return Move.Fizz + } + else if isDivisibleByFive(number: number) + { + return Move.Buzz + } + else + { + return Move.Number + } + } + + func isDivisibleByThree(number: Int) -> Bool + { + return isDivisibleBy(divisor: 3, number: number) + } + + func isDivisibleByFive(number: Int) -> Bool + { + return isDivisibleBy(divisor: 5, number: number) + } + + func isDivisibleByFifteen(number: Int) -> Bool + { + return isDivisibleBy(divisor: 15, number: number) + } + + private func isDivisibleBy(divisor: Int, number: Int) -> Bool + { + return number % divisor == 0 + } +} diff --git a/FizzBuzz/Game.swift b/FizzBuzz/Game.swift new file mode 100644 index 0000000..4b0691c --- /dev/null +++ b/FizzBuzz/Game.swift @@ -0,0 +1,29 @@ +import Foundation + +class Game: NSObject +{ + var score: Int + var brain: Brain + + override init() + { + score = 0 + brain = Brain() + super.init() + } + + func play(move: Move) -> (right: Bool, score: Int) + { + let resultingMove = brain.check(number: score + 1) + + if resultingMove == move + { + score += 1 + return (true, score) + } + else + { + return (false, score) + } + } +} diff --git a/FizzBuzz/Info.plist b/FizzBuzz/Info.plist new file mode 100644 index 0000000..0ca4d80 --- /dev/null +++ b/FizzBuzz/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/FizzBuzz/Move.swift b/FizzBuzz/Move.swift new file mode 100644 index 0000000..92811ee --- /dev/null +++ b/FizzBuzz/Move.swift @@ -0,0 +1,7 @@ +enum Move +{ + case Number + case Fizz + case Buzz + case FizzBuzz +} diff --git a/FizzBuzz/ViewController.swift b/FizzBuzz/ViewController.swift new file mode 100644 index 0000000..fb8763f --- /dev/null +++ b/FizzBuzz/ViewController.swift @@ -0,0 +1,58 @@ +import UIKit + +class ViewController: UIViewController +{ + var gameScore: Int? + { + didSet + { + guard let gameScore = gameScore else { return } + numberButton.setTitle("\(gameScore)", for: []) + } + } + + var game : Game? + + @IBOutlet weak var numberButton: UIButton! + @IBOutlet weak var fizzButton: UIButton! + @IBOutlet weak var buzzButton: UIButton! + @IBOutlet weak var fizzBuzzButton: UIButton! + + override func viewDidLoad() + { + super.viewDidLoad() + game = Game() + + gameScore = game?.score + } + + override func didReceiveMemoryWarning() + { + super.didReceiveMemoryWarning() + } + + func play(move: Move) + { + guard let game = game else { return } + + let response = game.play(move: move) + gameScore = response.score + } + + @IBAction func buttonTapped(_ sender: UIButton) + { + switch (sender) + { + case numberButton: + play(move: Move.Number) + case fizzButton: + play(move: Move.Fizz) + case buzzButton: + play(move: Move.Buzz) + case fizzBuzzButton: + play(move: Move.FizzBuzz) + default: + print("Invalid selection.") + } + } +} diff --git a/FizzBuzzTests/BrainTests.swift b/FizzBuzzTests/BrainTests.swift new file mode 100644 index 0000000..238fe56 --- /dev/null +++ b/FizzBuzzTests/BrainTests.swift @@ -0,0 +1,74 @@ +import XCTest + +@testable import FizzBuzz + +class BrainTests: XCTestCase +{ + var brain = Brain() + + func testIsDivisibleByThree_ThreeIs() + { + let result = brain.isDivisibleByThree(number: 3) + XCTAssertEqual(result, true) + } + + func testIsDivisibleByThree_FourIsNot() + { + let result = brain.isDivisibleByThree(number: 4) + XCTAssertEqual(result, false) + } + + func testIsDivisibleByFive_FiveIs() + { + let result = brain.isDivisibleByFive(number: 5) + XCTAssertEqual(result, true) + } + + func testIsDivisibleByFive_FourIsNot() + { + let result = brain.isDivisibleByFive(number: 4) + XCTAssertEqual(result, false) + } + + func testIsDivisibleByFifteen_ThirtyIs() + { + let result = brain.isDivisibleByFifteen(number: 30) + XCTAssertEqual(result, true) + } + + func testIsDivisibleByFifteen_TwentyIsNot() + { + let result = brain.isDivisibleByFifteen(number: 20) + XCTAssertEqual(result, false) + } + + func testCheck_3MeansFizz() + { + let result = brain.check(number: 3) + XCTAssertEqual(result, Move.Fizz) + } + + func testCheck_5MeansBuzz() + { + let result = brain.check(number: 5) + XCTAssertEqual(result, Move.Buzz) + } + + func testCheck_15MeansFizzBuzz() + { + let result = brain.check(number: 15) + XCTAssertEqual(result, Move.FizzBuzz) + } + + func testCheck_1Means1() + { + let result = brain.check(number: 1) + XCTAssertEqual(result, Move.Number) + } + + func testCheck_32Means32() + { + let result = brain.check(number: 32) + XCTAssertEqual(result, Move.Number) + } +} diff --git a/FizzBuzzTests/GameTests.swift b/FizzBuzzTests/GameTests.swift new file mode 100644 index 0000000..478d69b --- /dev/null +++ b/FizzBuzzTests/GameTests.swift @@ -0,0 +1,87 @@ +import XCTest + +@testable import FizzBuzz + +class GameTests: XCTestCase +{ + let game = Game() + + func testGameStartsAtZero() + { + XCTAssertTrue(game.score == 0) + } + + func testScoreIncrements() + { + _ = game.play(move: Move.Number) + XCTAssertTrue(game.score == 1) + } + + func testIfFizzMoveRight() + { + game.score = 2 + let response = game.play(move: Move.Fizz) + XCTAssertEqual(response.right, true) + } + + func testIfFizzMoveWrong() { + game.score = 1 + let response = game.play(move: Move.Fizz) + XCTAssertEqual(response.right, false) + } + + func testIfBuzzMoveRight() { + game.score = 4 + let response = game.play(move: Move.Buzz) + XCTAssertEqual(response.right, true) + } + + func testIfBuzzMoveWrong() { + game.score = 1 + let response = game.play(move: Move.Buzz) + XCTAssertEqual(response.right, false) + } + + func testIfFizzBuzzMoveRight() { + game.score = 14 + let response = game.play(move: Move.FizzBuzz) + XCTAssertEqual(response.right, true) + } + + func testIfFizzBuzzMoveWrong() { + game.score = 1 + let response = game.play(move: Move.FizzBuzz) + XCTAssertEqual(response.right, false) + } + + func testIfNumberMoveRight() { + game.score = 1 + let response = game.play(move: Move.Number) + XCTAssertEqual(response.right, true) + } + + func testIfNumberMoveWrong() { + game.score = 2 + let response = game.play(move: Move.Number) + XCTAssertEqual(response.right, false) + } + + func testIfMoveWrongScoreNotIncremented() + { + game.score = 1 + _ = game.play(move: Move.Fizz) + XCTAssertEqual(game.score, 1) + } + + func testPlayShouldReturnIfMoveRight() + { + let response = game.play(move: Move.Number) + XCTAssertNotNil(response.right) + } + + func testPlayShouldReturnNewScore() + { + let response = game.play(move: Move.Number) + XCTAssertNotNil(response.score) + } +} diff --git a/FizzBuzzTests/Info.plist b/FizzBuzzTests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/FizzBuzzTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/FizzBuzzTests/ViewControllerUnitTests.swift b/FizzBuzzTests/ViewControllerUnitTests.swift new file mode 100644 index 0000000..da05480 --- /dev/null +++ b/FizzBuzzTests/ViewControllerUnitTests.swift @@ -0,0 +1,71 @@ +import XCTest + +@testable import FizzBuzz + +class ViewControllerUnitTests: XCTestCase +{ + var viewController : ViewController! + + override func setUp() + { + super.setUp() + + let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main()) + viewController = storyboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController + UIApplication.shared().keyWindow!.rootViewController = viewController + + _ = viewController.view + } + + func testMove1IncrementsScore() + { + viewController.play(move: Move.Number) + let newScore = viewController.gameScore + XCTAssertEqual(newScore, 1) + } + + func testMove2IncrementScore() + { + viewController.play(move: Move.Number) + viewController.play(move: Move.Number) + let newScore = viewController.gameScore + XCTAssertEqual(newScore, 2) + } + + func testHasAGame() + { + XCTAssertNotNil(viewController.game) + } + + func testFizzIncrementScore() + { + viewController.game?.score = 2 + viewController.play(move: Move.Fizz) + let newScore = viewController.gameScore + XCTAssertEqual(newScore, 3) + } + + func testBuzzIncrementScore() + { + viewController.game?.score = 4 + viewController.play(move: Move.Buzz) + let newScore = viewController.gameScore + XCTAssertEqual(newScore, 5) + } + + func testFizzBuzzIncrementScore() + { + viewController.game?.score = 14 + viewController.play(move: Move.FizzBuzz) + let newScore = viewController.gameScore + XCTAssertEqual(newScore, 15) + } + + func testOnWrongMoveScoreNotIncremented() + { + viewController.game?.score = 2 + viewController.play(move: Move.Number) + let newScore = viewController.gameScore + XCTAssertEqual(newScore, 2) + } +} diff --git a/FizzBuzzUITests/Info.plist b/FizzBuzzUITests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/FizzBuzzUITests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/FizzBuzzUITests/ViewControllerUITests.swift b/FizzBuzzUITests/ViewControllerUITests.swift new file mode 100644 index 0000000..bb50205 --- /dev/null +++ b/FizzBuzzUITests/ViewControllerUITests.swift @@ -0,0 +1,89 @@ +import XCTest + +class ViewControllerUITests: XCTestCase +{ + let app: XCUIApplication = XCUIApplication() + var numberButton: XCUIElement? + var fizzButton: XCUIElement? + var buzzButton: XCUIElement? + var fizzBuzzButton: XCUIElement? + + override func setUp() + { + super.setUp() + + numberButton = app.buttons["numberButton"] + fizzButton = app.buttons["fizzButton"] + buzzButton = app.buttons["buzzButton"] + fizzBuzzButton = app.buttons["fizzBuzzButton"] + + continueAfterFailure = false + app.launch() + } + + override func tearDown() + { + super.tearDown() + } + + func playTo14() + { + numberButton?.tap() + numberButton?.tap() + fizzButton?.tap() + numberButton?.tap() + buzzButton?.tap() + fizzButton?.tap() + numberButton?.tap() + numberButton?.tap() + fizzButton?.tap() + buzzButton?.tap() + numberButton?.tap() + fizzButton?.tap() + numberButton?.tap() + numberButton?.tap() + } + + func testTapNumberButtonIncrementsScore() + { + numberButton?.tap() + let newScore = numberButton?.label + XCTAssertEqual(newScore, "1") + } + + func testTapNumberButtonTwiceIncrementsTo2() + { + numberButton?.tap() + numberButton?.tap() + let newScore = numberButton?.label + XCTAssertEqual(newScore, "2") + } + + func testTapFizzButtonIncrementsTo3() + { + numberButton?.tap() + numberButton?.tap() + fizzButton?.tap() + let newScore = numberButton?.label + XCTAssertEqual(newScore, "3") + } + + func testTapBuzzButtonIncrementsTo5() + { + numberButton?.tap() + numberButton?.tap() + fizzButton?.tap() + numberButton?.tap() + buzzButton?.tap() + let newScore = numberButton?.label + XCTAssertEqual(newScore, "5") + } + + func testTapFizzBuzzButtonIncrementsTo15() { + playTo14() + + fizzBuzzButton?.tap() + let newScore = numberButton?.label + XCTAssertEqual(newScore, "15") + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..6bfa179 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# FizzBuzz Application +Worked through this blog: +https://medium.com/@ynzc/getting-started-with-tdd-in-swift-2fab3e07204b#.9g3njdwgt +