GoPLS Viewer

Home|gopls/internal/diff/lcs/common_test.go
1// Copyright 2022 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package lcs
6
7import (
8    "log"
9    "math/rand"
10    "strings"
11    "testing"
12)
13
14type Btest struct {
15    ab string
16    lcs  []string
17}
18
19var Btests = []Btest{
20    {"aaabab""abaab", []string{"abab""aaab"}},
21    {"aabbba""baaba", []string{"aaba"}},
22    {"cabbx""cbabx", []string{"cabx""cbbx"}},
23    {"c""cb", []string{"c"}},
24    {"aaba""bbb", []string{"b"}},
25    {"bbaabb""b", []string{"b"}},
26    {"baaabb""bbaba", []string{"bbb""baa""bab"}},
27    {"baaabb""abbab", []string{"abb""bab""aab"}},
28    {"baaba""aaabba", []string{"aaba"}},
29    {"ca""cba", []string{"ca"}},
30    {"ccbcbc""abba", []string{"bb"}},
31    {"ccbcbc""aabba", []string{"bb"}},
32    {"ccb""cba", []string{"cb"}},
33    {"caef""axe", []string{"ae"}},
34    {"bbaabb""baabb", []string{"baabb"}},
35    // Example from Myers:
36    {"abcabba""cbabac", []string{"caba""baba""cbba"}},
37    {"3456aaa""aaa", []string{"aaa"}},
38    {"aaa""aaa123", []string{"aaa"}},
39    {"aabaa""aacaa", []string{"aaaa"}},
40    {"1a""a", []string{"a"}},
41    {"abab""bb", []string{"bb"}},
42    {"123""ab", []string{""}},
43    {"a""b", []string{""}},
44    {"abc""123", []string{""}},
45    {"aa""aa", []string{"aa"}},
46    {"abcde""12345", []string{""}},
47    {"aaa3456""aaa", []string{"aaa"}},
48    {"abcde""12345a", []string{"a"}},
49    {"ab""123", []string{""}},
50    {"1a2""a", []string{"a"}},
51    // for two-sided
52    {"babaab""cccaba", []string{"aba"}},
53    {"aabbab""cbcabc", []string{"bab"}},
54    {"abaabb""bcacab", []string{"baab"}},
55    {"abaabb""abaaaa", []string{"abaa"}},
56    {"bababb""baaabb", []string{"baabb"}},
57    {"abbbaa""cabacc", []string{"aba"}},
58    {"aabbaa""aacaba", []string{"aaaa""aaba"}},
59}
60
61func init() {
62    log.SetFlags(log.Lshortfile)
63}
64
65func check(t *testing.Tstr stringlcs lcswant []string) {
66    t.Helper()
67    if !lcs.valid() {
68        t.Errorf("bad lcs %v"lcs)
69    }
70    var got strings.Builder
71    for _dd := range lcs {
72        got.WriteString(str[dd.X : dd.X+dd.Len])
73    }
74    ans := got.String()
75    for _w := range want {
76        if ans == w {
77            return
78        }
79    }
80    t.Fatalf("str=%q lcs=%v want=%q got=%q"strlcswantans)
81}
82
83func checkDiffs(t *testing.Tbefore stringdiffs []Diffafter string) {
84    t.Helper()
85    var ans strings.Builder
86    sofar := 0 // index of position in before
87    for _d := range diffs {
88        if sofar < d.Start {
89            ans.WriteString(before[sofar:d.Start])
90        }
91        ans.WriteString(after[d.ReplStart:d.ReplEnd])
92        sofar = d.End
93    }
94    ans.WriteString(before[sofar:])
95    if ans.String() != after {
96        t.Fatalf("diff %v took %q to %q, not to %q"diffsbeforeans.String(), after)
97    }
98}
99
100func lcslen(l lcsint {
101    ans := 0
102    for _d := range l {
103        ans += int(d.Len)
104    }
105    return ans
106}
107
108// return a random string of length n made of characters from s
109func randstr(s stringn intstring {
110    src := []rune(s)
111    x := make([]runen)
112    for i := 0i < ni++ {
113        x[i] = src[rand.Intn(len(src))]
114    }
115    return string(x)
116}
117
118func TestLcsFix(t *testing.T) {
119    tests := []struct{ beforeafter lcs }{
120        {lcs{diag{003}, diag{225}, diag{345}, diag{894}}, lcs{diag{002}, diag{221}, diag{345}, diag{894}}},
121        {lcs{diag{116}, diag{6123}}, lcs{diag{115}, diag{6123}}},
122        {lcs{diag{004}, diag{354}}, lcs{diag{003}, diag{354}}},
123        {lcs{diag{0201}, diag{003}, diag{1204}}, lcs{diag{003}, diag{3222}}},
124        {lcs{diag{004}, diag{112}}, lcs{diag{004}}},
125        {lcs{diag{004}}, lcs{diag{004}}},
126        {lcs{}, lcs{}},
127        {lcs{diag{004}, diag{116}, diag{332}}, lcs{diag{001}, diag{116}}},
128    }
129    for nx := range tests {
130        got := x.before.fix()
131        if len(got) != len(x.after) {
132            t.Errorf("got %v, expected %v, for %v"gotx.afterx.before)
133        }
134        olen := lcslen(x.after)
135        glen := lcslen(got)
136        if olen != glen {
137            t.Errorf("%d: lens(%d,%d) differ, %v, %v, %v"nglenolengotx.afterx.before)
138        }
139    }
140}
141
MembersX
check.got
checkDiffs.after
randstr
randstr.n
TestLcsFix.RangeStmt_3624.n
randstr.s
TestLcsFix.t
Btest
init
check.RangeStmt_1953.dd
checkDiffs.before
lcslen
checkDiffs.RangeStmt_2326.d
TestLcsFix.tests
Btest.lcs
check.t
check.str
check.want
checkDiffs.diffs
TestLcsFix
TestLcsFix.RangeStmt_3624.BlockStmt.olen
check.RangeStmt_2046.w
checkDiffs.t
lcslen.l
lcslen.RangeStmt_2674.d
randstr.x
Btest.b
lcslen.ans
rand
testing
check
TestLcsFix.RangeStmt_3624.BlockStmt.glen
check.lcs
checkDiffs.ans
randstr.src
randstr.i
TestLcsFix.RangeStmt_3624.x
strings
Btest.a
check.ans
checkDiffs
checkDiffs.sofar
TestLcsFix.RangeStmt_3624.BlockStmt.got
Members
X