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
|
package packfile
import (
"fmt"
. "gopkg.in/check.v1"
)
type DeltaSuite struct {
testCases []deltaTest
}
var _ = Suite(&DeltaSuite{})
type piece struct {
val string
times int
}
type deltaTest struct {
description string
base []piece
target []piece
}
func (s *DeltaSuite) SetUpSuite(c *C) {
s.testCases = []deltaTest{{
description: "distinct file",
base: []piece{{"0", 300}},
target: []piece{{"2", 200}},
}, {
description: "same file",
base: []piece{{"1", 3000}},
target: []piece{{"1", 3000}},
}, {
description: "small file",
base: []piece{{"1", 3}},
target: []piece{{"1", 3}, {"0", 1}},
}, {
description: "big file",
base: []piece{{"1", 300000}},
target: []piece{{"1", 30000}, {"0", 1000000}},
}, {
description: "add elements before",
base: []piece{{"0", 200}},
target: []piece{{"1", 300}, {"0", 200}},
}, {
description: "add 10 times more elements at the end",
base: []piece{{"1", 300}, {"0", 200}},
target: []piece{{"0", 2000}},
}, {
description: "add elements between",
base: []piece{{"0", 400}},
target: []piece{{"0", 200}, {"1", 200}, {"0", 200}},
}, {
description: "add elements after",
base: []piece{{"0", 200}},
target: []piece{{"0", 200}, {"1", 200}},
}, {
description: "modify elements at the end",
base: []piece{{"1", 300}, {"0", 200}},
target: []piece{{"0", 100}},
}, {
description: "complex modification",
base: []piece{{"0", 3}, {"1", 40}, {"2", 30}, {"3", 2},
{"4", 400}, {"5", 23}},
target: []piece{{"1", 30}, {"2", 20}, {"7", 40}, {"4", 400},
{"5", 10}},
}}
}
func (s *DeltaSuite) TestAddDelta(c *C) {
for _, t := range s.testCases {
baseBuf := genBytes(t.base)
targetBuf := genBytes(t.target)
delta := DiffDelta(baseBuf, targetBuf)
result := PatchDelta(baseBuf, delta)
c.Log(fmt.Printf("Executing test case: %s\n", t.description))
c.Assert(result, DeepEquals, targetBuf)
}
}
func genBytes(elements []piece) []byte {
var result []byte
for _, e := range elements {
for i := 0; i < e.times; i++ {
result = append(result, e.val...)
}
}
return result
}
|