Skip to content

Commit 6dcb75d

Browse files
author
Daniel Barclay
committed
ManualTicTacToe: Moved text IO declarations to separate file.
1 parent 2ca5e3c commit 6dcb75d

File tree

5 files changed

+57
-36
lines changed

5 files changed

+57
-36
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package com.us.dsb.explore.algs.ttt.manual
22

3-
import com.us.dsb.explore.algs.ttt.manual.ui.GameUI
3+
import com.us.dsb.explore.algs.ttt.manual.ui.{ColoredConsoleTextIO, GameUI}
44

55
object ManualTicTacToe extends App {
66

7-
val gameResult = GameUI.runGame(GameUI.ColoredConsoleTextIO) // ?? specify starting user?
7+
val gameResult = GameUI.runGame(ColoredConsoleTextIO) // ?? specify starting user?
88
println("Game result: " + gameResult.text)
99

1010
}

src/main/scala/com/us/dsb/explore/algs/ttt/manual/ui/GameUI.scala

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,36 +17,6 @@ object GameUI {
1717
// ??? enhance; maybe just put clean strings in; maybe build on GameResult (plus quit case)
1818
case class GameUIResult(text: String)
1919

20-
// ?? revisit name
21-
trait SegregatedTextIO {
22-
private[ui] def printStateText(lineOrLines: String): Unit
23-
private[ui] def readPromptedLine(prompt: String): String
24-
private[ui] def printError(fullLine: String): Unit
25-
// ?? first, second, or both?:
26-
private[ui] def printResult(lineOrLines: String): Unit
27-
private[ui] def printResult(result: GameUIResult): Unit = printResult(result.text)
28-
}
29-
30-
class BaseConsoleTextIO extends SegregatedTextIO {
31-
import scala.io.StdIn.readLine
32-
33-
private[ui] override def printStateText(lineOrLines: String): Unit = println(lineOrLines)
34-
private[ui] override def readPromptedLine(prompt: String): String = readLine(prompt)
35-
private[ui] override def printError(fullLine: String): Unit = println(fullLine)
36-
private[ui] override def printResult(lineOrLines: String): Unit = println(lineOrLines)
37-
}
38-
39-
object PlainConsoleTextIO extends BaseConsoleTextIO
40-
41-
object ColoredConsoleTextIO extends BaseConsoleTextIO {
42-
import scala.io.AnsiColor._
43-
private[ui] override def readPromptedLine(prompt: String): String =
44-
super.readPromptedLine(BLUE + prompt + RESET)
45-
private[ui] override def printError(fullLine: String): Unit =
46-
super.printError(RED + fullLine + RESET)
47-
private[ui] override def printResult(lineOrLines: String): Unit =
48-
super.printResult(BOLD + lineOrLines + RESET)
49-
}
5020

5121
// ("extends EnumEntry" gets .entryName, enables Enum; "extends Enum[...]"
5222
// enables (and requires) .values.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.us.dsb.explore.algs.ttt.manual.ui
2+
3+
import com.us.dsb.explore.algs.ttt.manual.ui.GameUI.GameUIResult
4+
5+
// ?? revisit namea
6+
7+
private[ui] trait SegregatedTextIO {
8+
private[ui] def printStateText(lineOrLines: String): Unit
9+
private[ui] def readPromptedLine(prompt: String): String
10+
private[ui] def printError(fullLine: String): Unit
11+
// ?? first, second, or both?:
12+
private[ui] def printResult(lineOrLines: String): Unit
13+
private[ui] def printResult(result: GameUIResult): Unit = printResult(result.text)
14+
}
15+
16+
private[ui] class BaseConsoleTextIO extends SegregatedTextIO {
17+
import scala.io.StdIn.readLine
18+
19+
private[ui] override def printStateText(lineOrLines: String): Unit = println(lineOrLines)
20+
private[ui] override def readPromptedLine(prompt: String): String = readLine(prompt)
21+
private[ui] override def printError(fullLine: String): Unit = println(fullLine)
22+
private[ui] override def printResult(lineOrLines: String): Unit = println(lineOrLines)
23+
}
24+
25+
object PlainConsoleTextIO extends BaseConsoleTextIO
26+
27+
object ColoredConsoleTextIO extends BaseConsoleTextIO {
28+
import scala.io.AnsiColor._
29+
private[ui] override def readPromptedLine(prompt: String): String =
30+
super.readPromptedLine(BLUE + prompt + RESET)
31+
private[ui] override def printError(fullLine: String): Unit =
32+
super.printError(RED + fullLine + RESET)
33+
private[ui] override def printResult(lineOrLines: String): Unit =
34+
super.printResult(BOLD + lineOrLines + RESET)
35+
}

src/test/scala/com/us/dsb/explore/algs/ttt/manual/game/GameStateTest.scala

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ class GameStateTest extends AnyFunSpec {
88
describe("GameState$?. tryMoveAt") {
99
import Player._
1010
import scala.language.implicitConversions
11-
implicit def intToRow(int: Int): RowIndex = RowIndex(Index.unsafeFrom(int))
12-
implicit def intToCol(int: Int) = ColumnIndex(Index.unsafeFrom(int))
11+
implicit def intToRow(int: Int): RowIndex = RowIndex(Index.unsafeFrom(int))
12+
implicit def intToCol(int: Int): ColumnIndex = ColumnIndex(Index.unsafeFrom(int))
1313

1414

1515
ignore("marks cells") {
@@ -18,8 +18,23 @@ class GameStateTest extends AnyFunSpec {
1818
ignore("accepts marking an unmarked cell") {
1919

2020
}
21-
ignore("rejects marking an already marked cell") {
21+
describe("rejects marking an already marked cell:") {
22+
it("other player") {
23+
val reMarkResult =
24+
GameState.initial(Player.X)
25+
.tryMoveAt(1, 1).toOption.get
26+
.tryMoveAt(1, 1)
27+
assert(reMarkResult.isLeft, s" (reMarkResult = $reMarkResult)")
28+
}
29+
it("same player") {
2230

31+
val reMarkResult =
32+
GameState.initial(Player.X)
33+
.tryMoveAt(1, 1).toOption.get
34+
.tryMoveAt(3, 1).toOption.get
35+
.tryMoveAt(1, 1)
36+
assert(reMarkResult.isLeft, s" (reMarkResult = $reMarkResult)")
37+
}
2338
}
2439
describe("detects wins:") {
2540
it("one case") {

src/test/scala/com/us/dsb/explore/algs/ttt/manual/ui/GameUITest.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.us.dsb.explore.algs.ttt.manual.ui
22

3-
import com.us.dsb.explore.algs.ttt.manual.ui.GameUI.{GameUIResult, SegregatedTextIO}
43
import org.scalatest.funspec.AnyFunSpec
54
import org.scalatest.matchers.should.Matchers._
65

@@ -100,4 +99,6 @@ class GameUITest extends AnyFunSpec {
10099
}
101100
}
102101
}
102+
ignore("no coverage: markAtSelection's error case") {
103+
}
103104
}

0 commit comments

Comments
 (0)