File: TypeConstructionProps.scala

package info (click to toggle)
scala 2.11.12-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 62,924 kB
  • sloc: javascript: 28,808; java: 13,415; xml: 3,135; sh: 1,620; python: 756; makefile: 38; awk: 36; ansic: 6
file content (42 lines) | stat: -rw-r--r-- 1,373 bytes parent folder | download | duplicates (4)
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
import org.scalacheck._, Prop._, Gen._, Arbitrary._
import scala.reflect.runtime.universe._, Flag._, internal.reificationSupport.ScalaDot

object TypeConstructionProps extends QuasiquoteProperties("type construction")  {
  property("bare idents contain type names") = test {
    tq"x" ≈ Ident(TypeName("x"))
  }

  property("unquote type names into AppliedTypeTree") = forAll { (name1: TypeName, name2: TypeName) =>
    tq"$name1[$name2]" ≈ AppliedTypeTree(Ident(name1), List(Ident(name2)))
  }

  property("tuple type") = test {
    val empty = List[Tree]()
    val ts = List(tq"t1", tq"t2")
    assert(tq"(..$empty)" ≈ ScalaDot(TypeName("Unit")))
    assert(tq"(..$ts)" ≈ tq"scala.Tuple2[t1, t2]")
    assert(tq"(t0, ..$ts)" ≈ tq"scala.Tuple3[t0, t1, t2]")
  }

  property("single-element tuple type") = test {
    val ts = q"T" :: Nil
    assert(tq"(..$ts)" ≈ ts.head)
  }

  property("refined type") = test {
    val stats = q"def foo" :: q"val x: Int" :: q"type Y = String" :: Nil
    assert(tq"T { ..$stats }" ≈ tq"T { def foo; val x: Int; type Y = String }")
  }

  property("function type") = test {
    val argtpes = tq"A" :: tq"B" :: Nil
    val restpe = tq"C"
    assert(tq"..$argtpes => $restpe" ≈ tq"(A, B) => C")
  }

  property("empty tq") = test {
    val tt: TypeTree = tq""
    assert(tt.tpe == null)
    assert(tt.original == null)
  }
}