From 4bf5c72e12a4bbf42df9465a8968d0018df7f307 Mon Sep 17 00:00:00 2001 From: Steve Bement Date: Tue, 30 Aug 2016 12:45:42 -0700 Subject: [PATCH] completed solutions --- .DS_Store | Bin 0 -> 6148 bytes FizzBuzz.xcodeproj/project.pbxproj | 530 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + FizzBuzz/AppDelegate.swift | 46 ++ .../AppIcon.appiconset/Contents.json | 73 +++ FizzBuzz/Assets.xcassets/Contents.json | 6 + .../button_border.imageset/Contents.json | 21 + .../button_border.imageset/button_border.png | Bin 0 -> 6054 bytes .../champagne.imageset/Contents.json | 23 + .../champagne.imageset/champagne100.png | Bin 0 -> 2491 bytes .../champagne.imageset/champagne200.png | Bin 0 -> 6046 bytes .../champagne.imageset/champagne80.png | Bin 0 -> 2035 bytes .../lightning.imageset/Contents.json | 23 + .../lightning.imageset/lightning100.png | Bin 0 -> 1725 bytes .../lightning.imageset/lightning200.png | Bin 0 -> 3963 bytes .../lightning.imageset/lightning80.png | Bin 0 -> 1389 bytes .../space.imageset/Contents.json | 23 + .../space.imageset/space100.png | Bin 0 -> 2820 bytes .../space.imageset/space200.png | Bin 0 -> 6712 bytes .../space.imageset/space80.png | Bin 0 -> 2298 bytes FizzBuzz/Base.lproj/LaunchScreen.storyboard | 27 + FizzBuzz/Base.lproj/Main.storyboard | 126 +++++ FizzBuzz/Brain.swift | 42 ++ FizzBuzz/Game.swift | 29 + FizzBuzz/Info.plist | 45 ++ FizzBuzz/Move.swift | 7 + FizzBuzz/ViewController.swift | 58 ++ FizzBuzzTests/BrainTests.swift | 74 +++ FizzBuzzTests/GameTests.swift | 87 +++ FizzBuzzTests/Info.plist | 24 + FizzBuzzTests/ViewControllerUnitTests.swift | 71 +++ FizzBuzzUITests/Info.plist | 24 + FizzBuzzUITests/ViewControllerUITests.swift | 89 +++ README.md | 4 + 34 files changed, 1459 insertions(+) create mode 100644 .DS_Store create mode 100644 FizzBuzz.xcodeproj/project.pbxproj create mode 100644 FizzBuzz.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 FizzBuzz/AppDelegate.swift create mode 100644 FizzBuzz/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 FizzBuzz/Assets.xcassets/Contents.json create mode 100644 FizzBuzz/Assets.xcassets/button_border.imageset/Contents.json create mode 100644 FizzBuzz/Assets.xcassets/button_border.imageset/button_border.png create mode 100644 FizzBuzz/Assets.xcassets/champagne.imageset/Contents.json create mode 100644 FizzBuzz/Assets.xcassets/champagne.imageset/champagne100.png create mode 100644 FizzBuzz/Assets.xcassets/champagne.imageset/champagne200.png create mode 100644 FizzBuzz/Assets.xcassets/champagne.imageset/champagne80.png create mode 100644 FizzBuzz/Assets.xcassets/lightning.imageset/Contents.json create mode 100644 FizzBuzz/Assets.xcassets/lightning.imageset/lightning100.png create mode 100644 FizzBuzz/Assets.xcassets/lightning.imageset/lightning200.png create mode 100644 FizzBuzz/Assets.xcassets/lightning.imageset/lightning80.png create mode 100644 FizzBuzz/Assets.xcassets/space.imageset/Contents.json create mode 100644 FizzBuzz/Assets.xcassets/space.imageset/space100.png create mode 100644 FizzBuzz/Assets.xcassets/space.imageset/space200.png create mode 100644 FizzBuzz/Assets.xcassets/space.imageset/space80.png create mode 100644 FizzBuzz/Base.lproj/LaunchScreen.storyboard create mode 100644 FizzBuzz/Base.lproj/Main.storyboard create mode 100644 FizzBuzz/Brain.swift create mode 100644 FizzBuzz/Game.swift create mode 100644 FizzBuzz/Info.plist create mode 100644 FizzBuzz/Move.swift create mode 100644 FizzBuzz/ViewController.swift create mode 100644 FizzBuzzTests/BrainTests.swift create mode 100644 FizzBuzzTests/GameTests.swift create mode 100644 FizzBuzzTests/Info.plist create mode 100644 FizzBuzzTests/ViewControllerUnitTests.swift create mode 100644 FizzBuzzUITests/Info.plist create mode 100644 FizzBuzzUITests/ViewControllerUITests.swift create mode 100644 README.md diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..dc113b6d2765c79e4735edc63b9f23c6d7cd7b88 GIT binary patch literal 6148 zcmeHK%}T>S5dNlCiFhfVJnj<+eS;99XQ5XQVj}*~lAs2pr@V|$kre%bD~km&%BqN}IC1VBbt9PKlFVmhxruu;nF62;z8pu-Z&`k|T+R(s+% zDxi0l;S{%eZ&3|)@-%xAfiWCz!h)>Rto6%AAF7R kio$`FVy@Lvd_*^6KInj$C+s6KL-RiZCW8l8;71jB2L?n$?EnA( literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1701bdab281db4109a82a27c6053cda0c3613e99 GIT binary patch literal 6054 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 VgZy002ovPDHLkV1l@pbyENU literal 0 HcmV?d00001 diff --git a/FizzBuzz/Assets.xcassets/lightning.imageset/lightning80.png b/FizzBuzz/Assets.xcassets/lightning.imageset/lightning80.png new file mode 100644 index 0000000000000000000000000000000000000000..0cc29a23abf2e71307b8c1419e7acdb0936f518f GIT binary patch literal 1389 zcmV-z1(N!SP)Px)CrLy>RA>dwn_GxgRUF3Wn571$j-iqnGiDg%v-YA-DvA_JS>t${V$4)Vj2@Cg z5u-=J9(q?Is9sDHYVbjb=pqh^ii%o8;w^DZ9nl$U9Dm~(?Z9{JC1L$A1MRB13CuU-C{q1(Dm51tPs?9`ptVS53w8S8 zIA2&imEQ(aEC?w=@fDTYi&U(`^>N@ds6}*;bb^Ezb^bl-PA}AQvr1i5f4@?xTrEUH zt0#hUHL(0XIa`9Fi#Wdmf)|4%o{qmD&+fvxX!(R1x&8}zM~8*yb^a{~e7k;)oEzxp z-C^;W&uRH2a2EKC|47ynCo+%o8jz;N5jncP6UTQMant(A;7^~Hlj|TDnL_hB}PJ#nIN7G*NEzB!A$@vYC`5H|>#ql5VijTY>7c`o7 z0w1x5Bu_;ONx2y3{A%hoq|~)hd>WEAT)$_7OsgdI^*=mV-c62qCZeO9Z-&tIXsQMD zCpdnB03c$uazq`=l@Fy zKM`L6niQ2O)+I=;7FC~kS}4)lNcs)bgT89%!ykIJHGoCnu~j_RT!gjmRTW1AKlAjb zIZB?%X^uqoxuiO$k_s)AU5BTY-k_ymVq_MN6HmjWIgiWG97l7V!&Z|ZeyN8pvxOYh zH=s4~avl8aSp0YJXYL7^8waUe|JR{-J)m~qE@~a5BY;cSyWpRl*~vUNLc9vNihB?* z%cCdry%1}Pe8`n@cr|X=eLx3W2k~-;!oPug0;o^g zj=v$C70hMz81j+8h3hh-#j4ma83~pEefnlQwuf_BJxA>*@RM!T@M#3q{K#F9K(5;! zO^?B8WzikmauR4X{T0}Zi;&HTO=_!vB+WKe4{+&gEly%+7Dpm2@7f$>(PG+31b3~p zKmMwNEFWRa9eBHd%(}v21&h4>oK3{so8b8Lto>Nb!)X@f9^Lvxt% zKsystfi}2|V{q$31JVbueGHT!9QV1<2yDzp^c{kI;RIIBX@r)1VQ9KA6Z{2C;s%wQ ztO(6RLQ*{!`wf);LtTB6?mtM}04^02-$OlpELxi&`3?i&KDN%IjY0HF;Bo=+a(sO> ztEa07D6&VXcl$<95~I@~U?S)Qc|yW#>$sYOh;4aPbMGC{8f}HgtB9Ba&V#I>@5-$7 zC^0@2LbhgA&3(7Ps(3b!B?uW0Izg7ur`ff8kB5Ch%x0iDPg+R0>wWvMy!dm(Wc~iZ zP40EG*BCD^xdcHUg0#?F<&9(}&!q^e2WL{0UoV|-`GlxA!D| zCkWS4Zb7+J52!)dx)k9{$}0R>gllIjDz0)d_qXr7H5748QL4FCdg0pU`#nOu9?rSm z94wLufonkc4Wj`_|EW;kK;UT50fM0+zc!2IJXRr6@AY74TI+v%B9G{Sd$nUWE>Q0l v$7|V3{5o*0yob0v7JLsbfW_ri`na+OLwxUf?rKBn00000NkvXXu0mjf;`5nm literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..be49488e61750ced2a50c40345b054e1ed65d9c9 GIT binary patch literal 2820 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 O0000002-31^@s6QD2C%00001b5ch_0Itp) z=>Px-v`IukRCodHoO_5BRUF4%Q&-D0^ZhIzrIwF0^Fdlxl8Krorj%l(lx2~HU}?6L z{$VMhr1UV*7POKwD+a0GGujV6d(WK5 z@BGehX3m^*=FC>9^1oOfC@n3`gI@3966;3PQ7X%c!>yBNJi!!M`ZqhK7|;=>2J4ez;&^bPqoU(CJNWSAa6q&b}i1F3}c|KAIEy+*^rl)chnczd!u;bAQe(qM8Oge^rVtf}e~KhUBf)nE#3`2zYw*s_9K@MPFZ zv#w8P9NvHuh(b=GH2Jq6ji?2MQFzFva~t6+Q&&MEZ$lbTg9a=FjliRnP27TqQxzm` z=zyax!T8r;e5w&?zh^oA9M;1TQ0II-41*>RMBWXOIaYablvW1{z)5u541`P54JWQG zEC#m;Gs%|hAY|Qw>H1=SjPVbHQ)4%h*2=9Bq*sOKz>h2-Q=Xf?*rs9lQ2588l}Cv0 z;m3IL$ziJ<^rWKyB{0H|zS!l#@IG)T)e^(+{2)eCz8`2<;3T_A&Xn1UH)ux5bqb7GcQ_6m2vqi>0%0l*Ur?V35h^v^Y7nVOpHmVQn%rbI7!sf#`mR zwD?8iteFsGzBeaGE708=OhXVoMA`ezG1d$RWm+(7=T<&8X&8DdxQ(Sq_LME;&=^V+?Q%j~D|i#m zf=M1NSHN%(i{U($cfz(+aJ9k4pi!qNum;wFh80>Y(3_dT&=O4YDUqY;*pHhMV-ts? zn!{Gpsm@Z|&$7XfLn2wCp>kcZ(w#mu(eg#D4s@j?MW*7Yxse--qx!--a14?t3o%+JJ366)4zLW4LQ-V~hS$o(OTKPHl&hnj z3{$|@lOq#jvQS3DiILoX)=P*Wb$U7rM>Rm<%P>BO;uz-LhD}3o)b31ebA1}(sB2KX z1iY3>GOa&b<$k52F_m$Y40XJ+aFmuXmP21^B}papyl6^82| z!7>d;ZHU@_U0Ld6}L}^f2UxmXCQHj%p^EO0~sL)frX58Pvx`ouM1l zRz*0h2p%Lj8X}u=pxa4gN4`^HPU3M+dsqe96QwQHKY*5YEaA8@ybakDZP$*^coAco zfoT)R0piqAZ5|i;7b+=4eMOb~CpRv+n@@Wa$QAmFlf{Gq64>&5# zRsu#ehWYRZ><2Ztsl9%Vp8%&TkfbtM$=|y6a;7kOhM&tG=&x2X;v<-@{~lB;-6G;f zg4Z7SjpVVe#B?3@WAf?CdOczNicVyF7WnLqv4=5I4g1TZRYjzCu$OZSleZ=4spchm zP|Swh&HvmQlAea41s*L@r`t8XoZB(^b=!MQtBT1p$xTn}(lEFXoJ6g*rN#6ZfaZ~Vld^aOFQLePKVl!+PPm%;Exuo>*4{>F7I zmCyWKxv6P?2phJ4~4)Qub`E!-$KOrsw UQ0-?6%m4rY07*qoM6N<$g8GL`ga7~l literal 0 HcmV?d00001 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 +