-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathMain.scala
155 lines (133 loc) · 4.41 KB
/
Main.scala
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
import ai.x.diff._
import shapeless._
import scala.collection.immutable.SortedMap
sealed trait Parent
case class Bar( s: String, i: Int ) extends Parent
case class Foo( bar: Bar, b: List[Int], parent: Option[Parent] ) extends Parent
case class Id(int: Int)
case class Row(id: Id, value: String)
object Main extends App {
val bar = Bar("test",1)
val barAsParent: Parent = bar
val foo = Foo( bar, Nil, None )
val fooAsParent: Parent = foo
assert( DiffShow.diff( bar, bar ).isIdentical )
assert( DiffShow.diff( barAsParent, barAsParent ).isIdentical )
assert( DiffShow.diff( bar, barAsParent ).isIdentical )
assert( DiffShow.diff( barAsParent, bar ).isIdentical )
assert( DiffShow.diff( foo, foo ).isIdentical )
assert( DiffShow.diff( foo, fooAsParent ).isIdentical )
assert( DiffShow.diff( fooAsParent, foo ).isIdentical )
assert( DiffShow.diff( fooAsParent, fooAsParent ).isIdentical )
assert( !DiffShow.diff[Parent]( bar, foo ).isIdentical )
assert( !DiffShow.diff( bar, fooAsParent ).isIdentical )
assert( !DiffShow.diff( barAsParent, foo ).isIdentical )
assert( !DiffShow.diff( barAsParent, fooAsParent ).isIdentical )
assert( DiffShow.diff( Seq(bar), Seq(bar) ).isIdentical )
// Seqs are compared as Sets
assert( DiffShow.diff( Seq(bar), Seq(bar,bar) ).isIdentical )
assert( !DiffShow.diff[Seq[Parent]]( Seq(foo,bar), Seq(bar) ).isIdentical )
assert( !DiffShow.diff[Seq[Parent]]( Seq(foo), Seq(bar) ).isIdentical )
def ignore[T] = new DiffShow[T] {
def show( t: T ) = t.toString
def diff( left: T, right: T ) = Identical( "<not compared>" )
override def diffable( left: T, right: T ) = true
}
{
implicit val ignoreId = ignore[Id]
assert( DiffShow.diff( Id(1), Id(1) ).isIdentical )
assert( DiffShow.diff( Id(1), Id(2) ).isIdentical )
val rowA = Row(Id(1),"foo")
val rowB = Row(Id(2),"foo")
assert( DiffShow.diff( rowA, rowB ).isIdentical )
assert( DiffShow.diff( Seq(rowA), Seq(rowB) ).isIdentical )
}
assert( DiffShow.diff( Id(1), Id(1) ).isIdentical )
assert( !DiffShow.diff( Id(1), Id(2) ).isIdentical )
val rowA = Row(Id(1),"foo")
val rowB = Row(Id(2),"foo")
assert( !DiffShow.diff( rowA, rowB ).isIdentical )
assert( !DiffShow.diff( Seq(rowA), Seq(rowB) ).isIdentical )
/*
val before: Foo = Foo(
Bar( "asdf", 5 ),
List( 123, 1234 ),
Some( Bar( "asdf", 5 ) )
)
val after: Foo = Foo(
Bar( "asdf", 66 ),
List( 1234 ),
Some( Bar( "qwer", 5 ) )
)
println(
DiffShow.diff( before, after ).string
)
*/
{
implicit def StringDiffShow = new DiffShow[String] {
def show( t: String ) = t
def diff( left: String, right: String ) = if(left == right) Identical(left) else Different(left, right)
override def diffable( left: String, right: String ) = left.lift(0) == right.lift(0)
}
println(
DiffShow.diff(
"adsf" :: "qwer" :: Nil,
"axx" :: "yxcv" :: Nil
).string
)
}
{
implicit def HListDiffShow: DiffShow[HList] = new DiffShow[shapeless.HList] {
def show(t: HList) = t.toString
def diff(left: HList, right: HList) = if (left == right) Identical(left) else Different(left, right)
override def diffable(left: HList, right: HList) = left.runtimeLength == right.runtimeLength
}
println(
DiffShow.diff(
"abcd" :: 123 :: 'c' :: HNil,
"abcd" :: 123 :: 'c' :: HNil
)
)
println(
DiffShow.diff(
"abcd" :: 123 :: 'c' :: HNil,
"abcd" :: 125 :: 'b' :: HNil
)
)
}
/*
//import pprint.Config.Defaults._
val actual = compare( before, after )
val expected = Different(
Tree( before ),
Tree( after ),
SortedMap(
"bar" -> Different(
Tree( Bar( "asdf", 5 ) ),
Tree( Bar( "asdf", 66 ) ),
SortedMap(
"s" -> Identical( Leaf( "asdf" ) ),
"i" -> Different(
Leaf( 5 ), Leaf( 66 ), SortedMap()
)
)
),
"b" -> Different(
Leaf( 123 :: 1234 :: Nil ), Leaf( 1234 :: Nil ), SortedMap()
)
)
)
//pprint.pprintln( ( Generic[Bar] to Bar( "asdf", 5 ) ) delta ( Generic[Bar] to Bar( "asdf", 66 ) ) )
assert( actual == expected, "expected\n:" + pprint.tokenize( expected ).mkString + "\n\nactual:\n" + pprint.tokenize( actual ).mkString )
println( expected.show() )
"""
Foo(
b = List( 123 +, 1234 ),
bar = Bar(
s = asdf,
i = -5 +66
)
)
"""
*/
}