Permalink
Browse files

more tests

  • Loading branch information...
1 parent e0d95f9 commit a09e00c3b468fddbc4bd0eee3af2ebe2c8c5cc96 Chris Smith committed Jan 15, 2017
@@ -18,6 +18,7 @@
4BA9F3BE1E18B34D007D1506 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4BA9F3BC1E18B34D007D1506 /* MainMenu.xib */; };
4BA9F3C51E18B4C1007D1506 /* HintLauncher.app in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4BA9F3B61E18B34D007D1506 /* HintLauncher.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
4BA9F3C81E18B540007D1506 /* ServiceManagement.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BA9F3C71E18B540007D1506 /* ServiceManagement.framework */; };
+ 4BB276671E2BEE9A00801992 /* QuoteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BB276661E2BEE9A00801992 /* QuoteTests.swift */; };
4BB687A31E2561F400414325 /* Debug.csv in Resources */ = {isa = PBXBuildFile; fileRef = 4BB687A21E2561F400414325 /* Debug.csv */; };
4BD7DC531E1383E500237385 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BD7DC521E1383E500237385 /* AppDelegate.swift */; };
4BD7DC631E1383E500237385 /* SchedulerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BD7DC621E1383E500237385 /* SchedulerTests.swift */; };
@@ -73,6 +74,7 @@
4BA9F3C31E18B3A2007D1506 /* HintLauncher.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = HintLauncher.entitlements; sourceTree = "<group>"; };
4BA9F3C71E18B540007D1506 /* ServiceManagement.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ServiceManagement.framework; path = System/Library/Frameworks/ServiceManagement.framework; sourceTree = SDKROOT; };
4BA9F3C91E18C296007D1506 /* Hint.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Hint.entitlements; sourceTree = "<group>"; };
+ 4BB276661E2BEE9A00801992 /* QuoteTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuoteTests.swift; sourceTree = "<group>"; };
4BB687A21E2561F400414325 /* Debug.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = Debug.csv; path = Text/Debug.csv; sourceTree = "<group>"; };
4BD7DC4F1E1383E500237385 /* Hint.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Hint.app; sourceTree = BUILT_PRODUCTS_DIR; };
4BD7DC521E1383E500237385 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
@@ -190,6 +192,7 @@
4BD7DC641E1383E500237385 /* Info.plist */,
4BD7DC621E1383E500237385 /* SchedulerTests.swift */,
4B8AC5141E2AF9C900C99405 /* SoundTests.swift */,
+ 4BB276661E2BEE9A00801992 /* QuoteTests.swift */,
);
path = HintTests;
sourceTree = "<group>";
@@ -449,6 +452,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 4BB276671E2BEE9A00801992 /* QuoteTests.swift in Sources */,
4BD7DC631E1383E500237385 /* SchedulerTests.swift in Sources */,
4B8AC5151E2AF9C900C99405 /* SoundTests.swift in Sources */,
);
View
@@ -6,14 +6,16 @@
// Copyright © 2017 Chris Smith. All rights reserved.
//
-class Quote {
+class Quote: Equatable {
+
+ public static func ==(lhs: Quote, rhs: Quote) -> Bool {
+ return lhs.text == rhs.text && lhs.source == rhs.source
+ }
let text: String
let source: String
- let id: Int
- init(id: Int, text: String, source: String) {
- self.id = id
+ init(text: String, source: String) {
self.text = text
self.source = source
}
@@ -11,7 +11,6 @@ import Foundation
enum QuoteType: String {
case hints = "Hints"
- case debug = "Debug"
init(saved: String?) {
switch saved {
@@ -29,15 +28,13 @@ enum QuoteType: String {
init?(tag: Int) {
switch tag {
case 0: self = .hints
- case 99: self = .debug
default: return nil
}
}
func tag() -> Int {
switch self {
case .hints: return 0
- case .debug: return 99
}
}
}
@@ -46,7 +43,7 @@ class QuoteCollection {
private static let separator = "|"
- init?(type: QuoteType) {
+ convenience init?(type: QuoteType) {
// load csv from resource file.
guard let path = Bundle.main.path(forResource: type.rawValue, ofType: "csv"),
@@ -55,61 +52,83 @@ class QuoteCollection {
return nil
}
+ self.init(contents: contents)
+ }
+
+ init?(contents: String) {
+
// trim whitespace and split.
let trimmed = contents.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
let lines = trimmed.components(separatedBy: "\n")
- var index = 0
+ var quotes: [Quote] = []
// split by separator, include only quotes with >= 2 values
for line in lines {
let components = line.components(separatedBy: QuoteCollection.separator)
- if components.count >= 2 {
- quotes.append(Quote(id: index, text: components[0], source: components[1]))
- index += 1
- } else {
+ if components.count < 2 {
NSLog("loaded malformed quote: \(line), skipping")
+ } else {
+ quotes.append(Quote(text: components[0], source: components[1]))
}
}
// fail if 0 quotes, impossible to iterate over empty collection.
if quotes.count == 0 {
- NSLog("loaded quotes with no valid lines, type: \(type), contents: \(contents)")
+ NSLog("loaded quotes with no valid lines, contents: \(contents)")
return nil
}
+
+ self.originalOrder = quotes
+ self.readOrder = quotes
- DLog("loaded quotes, type: \(type), path: \(path), count: \(quotes.count)")
+ DLog("loaded quotes, count: \(quotes.count)")
}
+ let originalOrder: [Quote]
var cursor = 0
- var currentId = 0
- var quotes: [Quote] = []
+ var readOrder: [Quote]
+ var count: Int {
+ get { return originalOrder.count }
+ }
func next() -> Quote {
- let quote = quotes[cursor]
- cursor = cursor < quotes.count - 1 ? cursor + 1 : 0
- currentId = quotes[cursor].id
+ let quote = readOrder[cursor]
+ cursor = cursor < readOrder.count - 1 ? cursor + 1 : 0
return quote
}
func shuffle() {
- quotes.shuffle()
- DLog("shuffled quotes, order: \(quotes.map { return $0.id }), cursor: \(cursor), currentId: \(currentId)")
+ readOrder = originalOrder.shuffled()
+ DLog("shuffled quotes")
}
func unShuffle() {
- quotes.sort { return $0.id < $1.id }
- cursor = currentId
- DLog("unShuffled quotes, order: \(quotes.map { return $0.id }), cursor: \(cursor), currentId: \(currentId)")
+
+ let next = readOrder[cursor]
+ NSLog("next: \(next.text)")
+ for i in 0..<originalOrder.count {
+ if originalOrder[i] == next {
+ cursor = i
+ }
+ }
+
+ readOrder = originalOrder
+ DLog("unShuffled quotes, cursor: \(cursor)")
}
}
extension Array {
- mutating func shuffle() {
+
+ func shuffled() -> [Array.Element] {
+
+ var shuffled = self
for i in 0 ..< (count - 1) {
let j = Int(arc4random_uniform(UInt32(count - i))) + i
if i != j {
- swap(&self[i], &self[j])
+ swap(&shuffled[i], &shuffled[j])
}
}
+
+ return shuffled
}
}
View
@@ -0,0 +1,53 @@
+//
+// QuoteTests.swift
+// Hint
+//
+// Created by Christopher Smith on 1/15/17.
+// Copyright © 2017 Chris Smith. All rights reserved.
+//
+
+import XCTest
+@testable import Hint
+
+class QuoteTypeTests: XCTestCase {
+
+ func testSaved() {
+ XCTAssertEqual(QuoteType(saved: QuoteType.hints.rawValue), QuoteType.hints)
+ XCTAssertEqual(QuoteType(saved: nil), QuoteType.hints)
+ XCTAssertEqual(QuoteType(saved: "error"), QuoteType.hints)
+ }
+
+ func testTag() {
+ XCTAssertEqual(QuoteType(tag: QuoteType.hints.tag()), QuoteType.hints)
+ XCTAssertEqual(SoundType(tag: -1), nil)
+ }
+}
+
+class QuoteCollectionTests: XCTestCase {
+
+ func testInitQuoteType() {
+ let quotes = QuoteCollection(type: QuoteType.hints)
+ XCTAssertNotNil(quotes)
+ XCTAssert(quotes!.count > 0)
+ }
+
+ func testInitEmpty() {
+ let quotes = QuoteCollection(contents: "")
+ XCTAssertNil(quotes)
+ }
+
+ func testInitMalformed() {
+ let contents = "quote|source\nquote"
+ let quotes = QuoteCollection(contents: contents)
+ XCTAssertNotNil(quotes)
+ XCTAssertEqual(quotes!.count, 1)
+ }
+
+ func testNext() {
+ let contents = "quote1|source1\nquote2|source2"
+ let quotes = QuoteCollection(contents: contents)!
+ XCTAssertEqual(quotes.next(), Quote(text: "quote1", source: "source1"))
+ XCTAssertEqual(quotes.next(), Quote(text: "quote2", source: "source2"))
+ XCTAssertEqual(quotes.next(), Quote(text: "quote1", source: "source1"))
+ }
+}
@@ -11,16 +11,7 @@ import XCTest
class SoundTypeTests: XCTestCase {
- override func setUp() {
- super.setUp()
- }
-
- override func tearDown() {
- super.tearDown()
- }
-
func testSaved() {
-
XCTAssertEqual(SoundType(saved: SoundType.singingBowlLow.rawValue), SoundType.singingBowlLow)
XCTAssertEqual(SoundType(saved: nil), SoundType.silent)
XCTAssertEqual(SoundType(saved: "error"), SoundType.silent)

0 comments on commit a09e00c

Please sign in to comment.