Skip to content

Instantly share code, notes, and snippets.

@tututen tututen/ClosedRange.java
Last active Aug 1, 2017

Embed
What would you like to do?
TDDワークショップ 小室・横山チーム 2017/08/01
package jp.classmethod.tddbc;
public class ClosedRange {
private int lowerEndpoint;
private int upperEndpoint;
public int getLowerEndpoint() {
return this.lowerEndpoint;
}
public int getUpperEndpoint() {
return this.upperEndpoint;
}
@Override
public String toString() {
return "[" + this.getLowerEndpoint() + "," + this.getUpperEndpoint() + "]";
}
public void setEndpoint(int lowerEndpoint, int upperEndpoint) {
if (lowerEndpoint > upperEndpoint) {
throw new InvalidEndpointException();
}
this.lowerEndpoint = lowerEndpoint;
this.upperEndpoint = upperEndpoint;
}
public boolean contains(int num) {
return this.lowerEndpoint <= num && num <= this.upperEndpoint;
}
public boolean contains(ClosedRange other) {
return this.lowerEndpoint <= other.lowerEndpoint &&
this.upperEndpoint >= other.upperEndpoint;
}
public boolean equals(ClosedRange other) {
return this.lowerEndpoint == other.lowerEndpoint &&
this.upperEndpoint == other.upperEndpoint;
}
}
package jp.classmethod.tddbc;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
@RunWith(Enclosed.class)
public class ClosedRangeTest {
@RunWith(Enclosed.class)
public static class 整数閉区間は下端点と上端点を持つ {
public static class 整数閉区間は下端点を持つ {
@Test
public void 下端点3を持つ() {
// 前準備
ClosedRange closedRange = new ClosedRange();
closedRange.setEndpoint(3, 8);
// 実行 & 検証
assertEquals(3, closedRange.getLowerEndpoint());
}
@Test
public void 下端点5を持つ() {
// 前準備
ClosedRange closedRange = new ClosedRange();
closedRange.setEndpoint(5, 8);
// 実行 & 検証
assertEquals(5, closedRange.getLowerEndpoint());
}
}
public static class 整数閉区間は上端点を持つ {
@Test
public void 上端点8を持つ() {
// 前準備
ClosedRange closedRange = new ClosedRange();
closedRange.setEndpoint(3, 8);
// 実行 & 検証
assertEquals(8, closedRange.getUpperEndpoint());
}
@Test
public void 上端点10を持つ() {
// 前準備
ClosedRange closedRange = new ClosedRange();
closedRange.setEndpoint(3, 10);
// 実行 & 検証
assertEquals(10, closedRange.getUpperEndpoint());
}
}
}
public static class 文字列としても表現できる {
@Test
public void 下端点3上端点8の整数閉区間の文字列表記は_3_8_となる() {
// 前準備
ClosedRange closedRange = new ClosedRange();
closedRange.setEndpoint(3, 8);
// 実行 & 検証
assertEquals("[3,8]", closedRange.toString());
}
@Test
public void 下端点5上端点10の整数閉区間の文字列表記は_5_10_となる() {
// 前準備
ClosedRange closedRange = new ClosedRange();
closedRange.setEndpoint(5, 10);
// 実行 & 検証
assertEquals("[5,10]", closedRange.toString());
}
}
public static class 上端点より下端点が大きい閉区間を作ることはできない {
@Test(expected = InvalidEndpointException.class)
public void 下端点8上端点3の時設定できない() {
// 前準備
ClosedRange closedRange = new ClosedRange();
// 実行
closedRange.setEndpoint(8, 3);
}
@Test
public void 下端点3上端点3の時設定できる() {
// 前準備
ClosedRange closedRange = new ClosedRange();
// 実行
closedRange.setEndpoint(3, 3);
}
}
public static class 整数の閉区間は指定した整数を含むかどうかを判定できる {
ClosedRange closedRange;
@Before
public void setup() {
closedRange = new ClosedRange();
closedRange.setEndpoint(3, 8);
}
@Test
public void 下端点3上端点8の整数閉区間に3は含まれる() {
// 実行 & 検証
assertTrue(closedRange.contains(3));
}
@Test
public void 下端点3上端点8の整数閉区間に2は含まれない() {
// 実行 & 検証
assertFalse(closedRange.contains(2));
}
@Test
public void 下端点3上端点8の整数閉区間に8は含まれる() {
// 実行 & 検証
assertTrue(closedRange.contains(8));
}
@Test
public void 下端点3上端点8の整数閉区間に9は含まれない() {
// 実行 & 検証
assertFalse(closedRange.contains(9));
}
}
public static class 別の閉区間と等価かどうか判定できる {
ClosedRange closedRange;
ClosedRange closedRange2;
@Before
public void setup() {
closedRange = new ClosedRange();
closedRange2 = new ClosedRange();
closedRange.setEndpoint(3, 8);
}
@Test
public void 整数閉区間下端点3上端点8と下端点3上端点8が同値であること() {
// 前準備
closedRange2.setEndpoint(3, 8);
// 実行 & 検証
assertTrue(closedRange.equals(closedRange2));
}
@Test
public void 整数閉区間下端点3上端点8と下端点5上端点8が同値でないこと() {
// 前準備
closedRange2.setEndpoint(5, 8);
// 実行 & 検証
assertFalse(closedRange.equals(closedRange2));
}
@Test
public void 整数閉区間下端点3上端点8と下端点3上端点6が同値でないこと() {
// 前準備
closedRange2.setEndpoint(3, 6);
// 実行 & 検証
assertFalse(closedRange.equals(closedRange2));
}
@Test
public void 整数閉区間下端点3上端点8と下端点5上端点6が同値でないこと() {
// 前準備
closedRange2.setEndpoint(5, 6);
// 実行 & 検証
assertFalse(closedRange.equals(closedRange2));
}
}
@RunWith(Enclosed.class)
public static class 完全に含まれるかどうか判定できる {
public static class 整数閉区間下端点3上端点8に対して含まれる {
ClosedRange closedRange;
ClosedRange closedRange2;
@Before
public void setup() {
closedRange = new ClosedRange();
closedRange2 = new ClosedRange();
closedRange.setEndpoint(3, 8);
}
@Test
public void 整数閉区間下端点3上端点8に対して下端点4上端点7の閉区間が含まれること() {
// 前準備
closedRange2.setEndpoint(4, 7);
// 実行 & 検証
assertTrue(closedRange.contains(closedRange2));
}
@Test
public void 整数閉区間下端点3上端点8に対して下端点3上端点8の閉区間が含まれること() {
// 前準備
closedRange2.setEndpoint(3, 8);
// 実行 & 検証
assertTrue(closedRange.contains(closedRange2));
}
@Test
public void 整数閉区間下端点3上端点8に対して下端点3上端点7の閉区間が含まれること() {
// 前準備
closedRange2.setEndpoint(3, 7);
// 実行 & 検証
assertTrue(closedRange.contains(closedRange2));
}
@Test
public void 整数閉区間下端点3上端点8に対して下端点4上端点8の閉区間が含まれること() {
// 前準備
closedRange2.setEndpoint(4, 8);
// 実行 & 検証
assertTrue(closedRange.contains(closedRange2));
}
}
public static class 整数閉区間下端点3上端点8に対して含まれない {
ClosedRange closedRange;
ClosedRange closedRange2;
@Before
public void setup() {
closedRange = new ClosedRange();
closedRange2 = new ClosedRange();
closedRange.setEndpoint(3, 8);
}
@Test
public void 整数閉区間下端点3上端点8に対して下端点2上端点7の閉区間が含まれないこと() {
// 前準備
closedRange2.setEndpoint(2, 7);
// 実行 & 検証
assertFalse(closedRange.contains(closedRange2));
}
@Test
public void 整数閉区間下端点3上端点8に対して下端点4上端点9の閉区間が含まれないこと() {
// 前準備
closedRange2.setEndpoint(4, 9);
// 実行 & 検証
assertFalse(closedRange.contains(closedRange2));
}
@Test
public void 整数閉区間下端点3上端点8に対して下端点2上端点3の閉区間が含まれないこと() {
// 前準備
closedRange2.setEndpoint(2, 3);
// 実行 & 検証
assertFalse(closedRange.contains(closedRange2));
}
@Test
public void 整数閉区間下端点3上端点8に対して下端点8上端点9の閉区間が含まれないこと() {
// 前準備
closedRange2.setEndpoint(8, 9);
// 実行 & 検証
assertFalse(closedRange.contains(closedRange2));
}
@Test
public void 整数閉区間下端点3上端点8に対して下端点2上端点9の閉区間が含まれないこと() {
// 前準備
closedRange2.setEndpoint(2, 9);
// 実行 & 検証
assertFalse(closedRange.contains(closedRange2));
}
@Test
public void 整数閉区間下端点3上端点8に対して下端点10上端点13の閉区間が含まれないこと() {
// 前準備
closedRange2.setEndpoint(10, 13);
// 実行 & 検証
assertFalse(closedRange.contains(closedRange2));
}
@Test
public void 整数閉区間下端点3上端点8に対して下端点0上端点2の閉区間が含まれないこと() {
// 前準備
closedRange2.setEndpoint(0, 2);
// 実行 & 検証
assertFalse(closedRange.contains(closedRange2));
}
}
}
}
package jp.classmethod.tddbc;
public class InvalidEndpointException extends RuntimeException {
}
整数閉区間を示すオブジェクトをつくりたい。
- [x] 整数閉区間は下端点と上端点を持つ
- [x] 整数閉区間は下端点3を持つ
- [x] 整数閉区間は下端点5を持つ
- [x] 整数閉区間は上端点8を持つ
- [x] 整数閉区間は上端点10を持つ
- [x] 文字列としても表現できる
- [x] 下端点 3, 上端点 8 の整数閉区間の文字列表記は "[3,8]" となる
- [x] 下端点 5, 上端点 10 の整数閉区間の文字列表記は "[5,10]" となる
- [x] 上端点より下端点が大きい閉区間を作ることはできない
- [x] 下端点 8, 上端点 3 の時設定できない
- [x] 下端点 3, 上端点 3 の時設定できる
- [x] 整数の閉区間は指定した整数を含むかどうかを判定できる
- [x] 下端点 3, 上端点 8 の整数閉区間に3は含まれる
- [x] 下端点 3, 上端点 8 の整数閉区間に2は含まれない
- [x] 下端点 3, 上端点 8 の整数閉区間に8は含まれる
- [x] 下端点 3, 上端点 8 の整数閉区間に9は含まれない
- [x] 別の閉区間と等価かどうか判定できる
- [x] 整数閉区間下端点 3, 上端点 8と下端点 3, 上端点 8が同値であること
- [x] 整数閉区間下端点 3, 上端点 8と下端点 5, 上端点 8が同値でないこと
- [x] 整数閉区間下端点 3, 上端点 8と下端点 3, 上端点 6が同値でないこと
- [x] 整数閉区間下端点 3, 上端点 8と下端点 5, 上端点 6が同値でないこと
- [x] 完全に含まれるかどうか判定できる
- [x] 整数閉区間下端点 3, 上端点 8に対して閉区間下端点 4, 上端点 7が含まれること
- [x] 整数閉区間下端点 3, 上端点 8に対して閉区間下端点 3, 上端点 8が含まれること
- [x] 整数閉区間下端点 3, 上端点 8に対して閉区間下端点 3, 上端点 7が含まれること
- [x] 整数閉区間下端点 3, 上端点 8に対して閉区間下端点 4, 上端点 8が含まれること
- [x] 整数閉区間下端点 3, 上端点 8に対して閉区間下端点 2, 上端点 7が含まれないこと
- [x] 整数閉区間下端点 3, 上端点 8に対して閉区間下端点 4, 上端点 9が含まれないこと
- [x] 整数閉区間下端点 3, 上端点 8に対して閉区間下端点 2, 上端点 3が含まれないこと
- [x] 整数閉区間下端点 3, 上端点 8に対して閉区間下端点 8, 上端点 9が含まれないこと
- [x] 整数閉区間下端点 3, 上端点 8に対して閉区間下端点 2, 上端点 9が含まれないこと
- [x] 整数閉区間下端点 3, 上端点 8に対して閉区間下端点 10, 上端点 13が含まれないこと
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.