aboutsummaryrefslogtreecommitdiff
path: root/tests/run/generic/Test.scala
blob: ac0dc4d5aae3434eca2e8d6d40d6002bf3c213a2 (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
import generic._
import Tree._
import List._
import java.io._
import Shapes._
import SearchResult._

object Test {
  import Serialization._

  private var lCount, tCount, sCount = 0

// ------- Code that will eventually be produced by macros -------------

  implicit def ListSerializable[Elem](implicit es: Serializable[Elem]): Serializable[List[Elem]] = {
    implicit lazy val lsElem: Serializable[List[Elem]] = {
      lCount += 1 // test code to verify we create bounded number of Serializables
      RecSerializable[List[Elem], List.Shape[Elem]]
    }
    lsElem
  }

  implicit def TreeSerializable[R]: Serializable[Tree[R]] = {
    implicit lazy val tR: Serializable[Tree[R]] = {
      tCount += 1 // test code to verify we create bounded number of Serializables
      RecSerializable[Tree[R], Tree.Shape[R]]
    }
    tR
  }
  implicit lazy val tsInt: Serializable[Tree[Int]] = TreeSerializable[Int]
  implicit lazy val tsBoolean: Serializable[Tree[Boolean]] = TreeSerializable[Boolean]

  implicit lazy val SearchResultSerializable: Serializable[SearchResult] = {
    sCount += 1
    RecSerializable[SearchResult, SearchResult.Shape]
  }

// ------- Test code --------------------------------------------------------

  /** Serialize data, then deserialize it back and check that it is the same. */
  def sds[D](data: D)(implicit ser: Serializable[D]) = {
    val outBytes = new ByteArrayOutputStream
    val out = new DataOutputStream(outBytes)
    ser.write(data, out)
    out.flush()
    val inBytes = new ByteArrayInputStream(outBytes.toByteArray)
    val in = new DataInputStream(inBytes)
    val result = ser.read(in)
    assert(data == result, s"$data != $result")
  }

  val data1 =
    Cons(1, Cons(2, Cons(3, Nil)))

  val data2 =
    If(IsZero(Pred(Succ(Zero))), Succ(Succ(Zero)), Pred(Pred(Zero)))

  val data3 = Cons(Color.Red, Cons(Color.Green, Cons(Color.Blue, Nil)))

  val data4 = Ambiguous(Success(Color.Green), Diverging)

  def main(args: Array[String]) = {
    sds(data1)
    assert(lCount == 1, lCount)
    sds(data2)
    assert(tCount == 2, tCount)
    sds(data3)
    assert(lCount == 2, lCount)
    sds(data4)
    assert(sCount == 1, sCount)
  }
}