Last active
August 1, 2017 09:40
-
-
Save suwa-yuki/4ff6b5523908e9231647b7a1853ee102 to your computer and use it in GitHub Desktop.
TDDワークショップ成果物 http://bit.ly/2uEATGA
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
struct ClosedRange { | |
let lowerEndpoint: Int | |
let upperEndpoint: Int | |
init?(lowerEndpoint: Int, upperEndpoint: Int) { | |
guard lowerEndpoint < upperEndpoint else { return nil } | |
self.lowerEndpoint = lowerEndpoint | |
self.upperEndpoint = upperEndpoint | |
} | |
} | |
extension ClosedRange { | |
var rangeString: String { | |
return "[\(lowerEndpoint),\(upperEndpoint)]" | |
} | |
} | |
extension ClosedRange { | |
func contains(_ target: Int) -> Bool { | |
return lowerEndpoint < target && upperEndpoint > target | |
} | |
func contains(_ target: ClosedRange) -> Bool { | |
return lowerEndpoint <= target.lowerEndpoint && upperEndpoint >= target.upperEndpoint | |
} | |
} | |
extension ClosedRange: Equatable { | |
static func ==(lhs: ClosedRange, rhs: ClosedRange) -> Bool { | |
return lhs.lowerEndpoint == rhs.lowerEndpoint && lhs.upperEndpoint == rhs.upperEndpoint | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Quick | |
import Nimble | |
@testable import TDDBC | |
class ClosedRangeSpec: QuickSpec { | |
override func spec() { | |
// 整数閉区間を示すオブジェクトをつくりたい。 | |
// 整数閉区間は下端点と上端点を持ち、 | |
describe("下端点と上端点を持てる") { | |
context("下端点を3、上端点を8としたとき") { | |
let target = ClosedRange(lowerEndpoint: 3, upperEndpoint: 8)! | |
it("下端点が3であること") { | |
expect(target.lowerEndpoint).to(equal(3)) | |
} | |
it("上端点が8であること") { | |
expect(target.upperEndpoint).to(equal(8)) | |
} | |
} | |
} | |
// 文字列としても表現できる(例: 下端点 3, 上端点 8 の整数閉区間の文字列表記は "[3,8]")。 | |
describe("区間を文字列として表現できる") { | |
context("下端点を3、上端点を8としたとき") { | |
let target = ClosedRange(lowerEndpoint: 3, upperEndpoint: 8)! | |
it("文字列'[3,8]'を返すこと") { | |
expect(target.rangeString).to(equal("[3,8]")) | |
} | |
} | |
} | |
// ただし、上端点より下端点が大きい閉区間を作ることはできない。 | |
describe("下端点より上端点が大きい") { | |
context("下端点より上端点が大きいとき") { | |
it("オブジェクトが生成できること") { | |
let target = ClosedRange(lowerEndpoint: 3, upperEndpoint: 8) | |
expect(target).toNot(beNil()) | |
} | |
} | |
context("下端点より上端点が小さいとき") { | |
it("オブジェクトが生成できないこと") { | |
let target = ClosedRange(lowerEndpoint: 8, upperEndpoint: 3) | |
expect(target).to(beNil()) | |
} | |
} | |
context("下端点と上端点が等しいとき") { | |
it("オブジェクトが生成できないこと") { | |
let target = ClosedRange(lowerEndpoint: 8, upperEndpoint: 8) | |
expect(target).to(beNil()) | |
} | |
} | |
} | |
// 整数の閉区間は指定した整数を含むかどうかを判定できる。 | |
describe("指定した整数を含むかどうかを判定できる") { | |
context("指定した整数を含むとき") { | |
it("trueを返すこと") { | |
let target = ClosedRange(lowerEndpoint: 3, upperEndpoint: 8)! | |
expect(target.contains(4)).to(beTrue()) | |
} | |
} | |
context("指定した整数が下端点より小さいとき") { | |
it("falseを返すこと") { | |
let target = ClosedRange(lowerEndpoint: 3, upperEndpoint: 8)! | |
expect(target.contains(9)).to(beFalse()) | |
} | |
} | |
context("指定した整数が下端点と等しいとき") { | |
it("falseを返すこと") { | |
let target = ClosedRange(lowerEndpoint: 3, upperEndpoint: 8)! | |
expect(target.contains(3)).to(beFalse()) | |
} | |
} | |
context("指定した整数が上端点より大きいとき") { | |
it("falseを返すこと") { | |
let target = ClosedRange(lowerEndpoint: 3, upperEndpoint: 8)! | |
expect(target.contains(9)).to(beFalse()) | |
} | |
} | |
context("指定した整数が上端点と等しいとき") { | |
it("falseを返すこと") { | |
let target = ClosedRange(lowerEndpoint: 3, upperEndpoint: 8)! | |
expect(target.contains(8)).to(beFalse()) | |
} | |
} | |
} | |
// また、別の閉区間と等価かどうかや、 | |
describe("別の閉区間と等価かどうかを判定できる") { | |
context("下端と上端が等しいとき") { | |
it("trueを返すこと") { | |
let a = ClosedRange(lowerEndpoint: 3, upperEndpoint: 8)! | |
let b = ClosedRange(lowerEndpoint: 3, upperEndpoint: 8)! | |
expect(a == b).to(beTrue()) | |
} | |
} | |
context("下端と上端が等しくないとき") { | |
it("falseを返すこと") { | |
let a = ClosedRange(lowerEndpoint: 3, upperEndpoint: 8)! | |
let b = ClosedRange(lowerEndpoint: 4, upperEndpoint: 8)! | |
expect(a == b).to(beFalse()) | |
} | |
} | |
} | |
// 完全に含まれるかどうかも判定できる。 | |
describe("完全に含まれるかどうかを判定できる") { | |
context("別の閉区間が含まれるとき") { | |
it("trueを返すこと") { | |
let a = ClosedRange(lowerEndpoint: 3, upperEndpoint: 8)! | |
let b = ClosedRange(lowerEndpoint: 4, upperEndpoint: 7)! | |
expect(a.contains(b)).to(beTrue()) | |
} | |
} | |
context("別の閉区間の下端が含まれないとき") { | |
it("trueを返すこと") { | |
let a = ClosedRange(lowerEndpoint: 3, upperEndpoint: 8)! | |
let b = ClosedRange(lowerEndpoint: 2, upperEndpoint: 7)! | |
expect(a.contains(b)).to(beFalse()) | |
} | |
} | |
context("別の閉区間の上端が含まれないとき") { | |
it("trueを返すこと") { | |
let a = ClosedRange(lowerEndpoint: 3, upperEndpoint: 8)! | |
let b = ClosedRange(lowerEndpoint: 4, upperEndpoint: 9)! | |
expect(a.contains(b)).to(beFalse()) | |
} | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment