Skip to content

Instantly share code, notes, and snippets.

@suwa-yuki
Last active August 1, 2017 09:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save suwa-yuki/4ff6b5523908e9231647b7a1853ee102 to your computer and use it in GitHub Desktop.
Save suwa-yuki/4ff6b5523908e9231647b7a1853ee102 to your computer and use it in GitHub Desktop.
TDDワークショップ成果物 http://bit.ly/2uEATGA
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
}
}
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