summaryrefslogtreecommitdiff
path: root/partest/src/main/scala/scala/tools/partest/scalajs/ScalaJSPartestOptions.scala
blob: 1f1680a0163d6352ffe8c53a9cf016f11978e8d3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package scala.tools.partest.scalajs

class ScalaJSPartestOptions private (
  val testFilter: ScalaJSPartestOptions.TestFilter,
  val optMode: ScalaJSPartestOptions.OptMode,
  val showDiff: Boolean
)

object ScalaJSPartestOptions {

  sealed abstract class TestFilter {
    def descr: String
  }
  case object UnknownTests extends TestFilter {
    override def descr: String = "Unknown"
  }
  case object BlacklistedTests extends TestFilter {
    override def descr: String = "Blacklisted"
  }
  case object WhitelistedTests extends TestFilter {
    override def descr: String = "Whitelisted"
  }
  case object BuglistedTests extends TestFilter {
    override def descr: String = "Buglisted"
  }
  case class SomeTests(names: List[String]) extends TestFilter {
    override def descr: String = "Custom " + this.toString
    override def toString() =
      names.map(x => s""""$x"""").mkString("[", ", ", "]")
  }

  sealed abstract class OptMode {
    def shortStr: String
    def id: String
  }
  object OptMode {
    def fromId(id: String): OptMode = id match {
      case "none"  => NoOpt
      case "fast"  => FastOpt
      case "full"  => FullOpt
      case _       => sys.error(s"Unknown optimization mode: $id")
    }
  }
  case object NoOpt extends OptMode {
    def shortStr: String = "None"
    def id: String = "none"
  }
  case object FastOpt extends OptMode {
    def shortStr: String = "Fast"
    def id: String = "fast"
  }
  case object FullOpt extends OptMode {
    def shortStr: String = "Full"
    def id: String = "full"
  }

  def apply(args: Array[String],
      errorReporter: String => Unit): Option[ScalaJSPartestOptions] = {

    var failed = false

    var filter: Option[TestFilter] = None
    var optMode: OptMode = NoOpt
    var showDiff: Boolean = false

    def error(msg: String) = {
      failed = true
      errorReporter(msg)
    }

    def setFilter(newFilter: TestFilter) = (filter, newFilter) match {
      case (Some(SomeTests(oldNames)), SomeTests(newNames)) =>
        // Merge test names
        filter = Some(SomeTests(oldNames ++ newNames))
      case (Some(fil), newFilter) =>
        error(s"You cannot specify twice what tests to use (already specified: $fil, new: $newFilter)")
      case (None, newFilter) =>
        filter = Some(newFilter)
    }

    for (arg <- args) arg match {
      case "--fastOpt" =>
        optMode = FastOpt
      case "--noOpt" =>
        optMode = NoOpt
      case "--fullOpt" =>
        optMode = FullOpt
      case "--blacklisted" =>
        setFilter(BlacklistedTests)
      case "--buglisted" =>
        setFilter(BuglistedTests)
      case "--whitelisted" =>
        setFilter(WhitelistedTests)
      case "--unknown" =>
        setFilter(UnknownTests)
      case "--showDiff" =>
        showDiff = true
      case _ =>
        setFilter(SomeTests(arg :: Nil))
    }

    if (failed) None
    else Some {
      new ScalaJSPartestOptions(
        filter.getOrElse(WhitelistedTests), optMode, showDiff)
    }
  }

}