Mercurial > hg-stable
annotate tests/test-linelog.py @ 43874:bc7d8f45c3b6
rust-dirs: handle forgotten `Result`s
In 1fe2e574616e I introduced a temporary bugfix to align Rust code with a new
behavior from C/Python and forgot about a few `Result`s (cargo's compiler cache
does not re-emit warnings on cached modules). This fixes it.
For the record, I am still unsure that this behavior change is a good idea.
Note: I was already quite unhappy with the setters and getters for the
`DirstateMap` and, indirectly, `Dirs`, and this only further reinforces my
feelings. I hope we can one day fix that situation at the type level; Georges
Racinet and I were just talking about devising a POC for using the builder
pattern in the context of FFI with Python, we'll see what comes out of it.
Differential Revision: https://phab.mercurial-scm.org/D7609
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Thu, 12 Dec 2019 15:55:25 +0100 |
parents | 2372284d9457 |
children | e52a9c85a7a8 |
rev | line source |
---|---|
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
1 from __future__ import absolute_import, print_function |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
2 |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
3 import difflib |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
4 import random |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
5 import unittest |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
6 |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
7 from mercurial import linelog |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
8 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
9 vecratio = 3 # number of replacelines / number of replacelines_vec |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
10 maxlinenum = 0xFFFFFF |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
11 maxb1 = 0xFFFFFF |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
12 maxdeltaa = 10 |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
13 maxdeltab = 10 |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
14 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
15 |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
16 def _genedits(seed, endrev): |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
17 lines = [] |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
18 random.seed(seed) |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
19 for rev in range(0, endrev): |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
20 n = len(lines) |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
21 a1 = random.randint(0, n) |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
22 a2 = random.randint(a1, min(n, a1 + maxdeltaa)) |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
23 b1 = random.randint(0, maxb1) |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
24 b2 = random.randint(b1, b1 + maxdeltab) |
38963
6fed8b323651
linelog: add replacelines_vec for fastannotate
Augie Fackler <augie@google.com>
parents:
38849
diff
changeset
|
25 usevec = not bool(random.randint(0, vecratio)) |
6fed8b323651
linelog: add replacelines_vec for fastannotate
Augie Fackler <augie@google.com>
parents:
38849
diff
changeset
|
26 if usevec: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
27 blines = [ |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
28 (random.randint(0, rev), random.randint(0, maxlinenum)) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
29 for _ in range(b1, b2) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
30 ] |
38963
6fed8b323651
linelog: add replacelines_vec for fastannotate
Augie Fackler <augie@google.com>
parents:
38849
diff
changeset
|
31 else: |
6fed8b323651
linelog: add replacelines_vec for fastannotate
Augie Fackler <augie@google.com>
parents:
38849
diff
changeset
|
32 blines = [(rev, bidx) for bidx in range(b1, b2)] |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
33 lines[a1:a2] = blines |
38963
6fed8b323651
linelog: add replacelines_vec for fastannotate
Augie Fackler <augie@google.com>
parents:
38849
diff
changeset
|
34 yield lines, rev, a1, a2, b1, b2, blines, usevec |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
35 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
36 |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
37 class linelogtests(unittest.TestCase): |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
38 def testlinelogencodedecode(self): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
39 program = [ |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
40 linelog._eof(0, 0), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
41 linelog._jge(41, 42), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
42 linelog._jump(0, 43), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
43 linelog._eof(0, 0), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
44 linelog._jl(44, 45), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
45 linelog._line(46, 47), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
46 ] |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
47 ll = linelog.linelog(program, maxrev=100) |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
48 enc = ll.encode() |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
49 # round-trips okay |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
50 self.assertEqual(linelog.linelog.fromdata(enc)._program, ll._program) |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
51 self.assertEqual(linelog.linelog.fromdata(enc), ll) |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
52 # This encoding matches the encoding used by hg-experimental's |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
53 # linelog file, or is supposed to if it doesn't. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
54 self.assertEqual( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
55 enc, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
56 ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
57 b'\x00\x00\x01\x90\x00\x00\x00\x06' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
58 b'\x00\x00\x00\xa4\x00\x00\x00*' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
59 b'\x00\x00\x00\x00\x00\x00\x00+' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
60 b'\x00\x00\x00\x00\x00\x00\x00\x00' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
61 b'\x00\x00\x00\xb1\x00\x00\x00-' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
62 b'\x00\x00\x00\xba\x00\x00\x00/' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
63 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
64 ) |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
65 |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
66 def testsimpleedits(self): |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
67 ll = linelog.linelog() |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
68 # Initial revision: add lines 0, 1, and 2 |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
69 ll.replacelines(1, 0, 0, 0, 3) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
70 self.assertEqual( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
71 [(l.rev, l.linenum) for l in ll.annotate(1)], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
72 [(1, 0), (1, 1), (1, 2),], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
73 ) |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
74 # Replace line 1 with a new line |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
75 ll.replacelines(2, 1, 2, 1, 2) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
76 self.assertEqual( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
77 [(l.rev, l.linenum) for l in ll.annotate(2)], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
78 [(1, 0), (2, 1), (1, 2),], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
79 ) |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
80 # delete a line out of 2 |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
81 ll.replacelines(3, 1, 2, 0, 0) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
82 self.assertEqual( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
83 [(l.rev, l.linenum) for l in ll.annotate(3)], [(1, 0), (1, 2),] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
84 ) |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
85 # annotation of 1 is unchanged |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
86 self.assertEqual( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
87 [(l.rev, l.linenum) for l in ll.annotate(1)], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
88 [(1, 0), (1, 1), (1, 2),], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
89 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
90 ll.annotate(3) # set internal state to revision 3 |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
91 start = ll.getoffset(0) |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
92 end = ll.getoffset(1) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
93 self.assertEqual(ll.getalllines(start, end), [(1, 0), (2, 1), (1, 1),]) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
94 self.assertEqual(ll.getalllines(), [(1, 0), (2, 1), (1, 1), (1, 2),]) |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
95 |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
96 def testparseclinelogfile(self): |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
97 # This data is what the replacements in testsimpleedits |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
98 # produce when fed to the original linelog.c implementation. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
99 data = ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
100 b'\x00\x00\x00\x0c\x00\x00\x00\x0f' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
101 b'\x00\x00\x00\x00\x00\x00\x00\x02' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
102 b'\x00\x00\x00\x05\x00\x00\x00\x06' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
103 b'\x00\x00\x00\x06\x00\x00\x00\x00' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
104 b'\x00\x00\x00\x00\x00\x00\x00\x07' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
105 b'\x00\x00\x00\x06\x00\x00\x00\x02' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
106 b'\x00\x00\x00\x00\x00\x00\x00\x00' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
107 b'\x00\x00\x00\t\x00\x00\x00\t' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
108 b'\x00\x00\x00\x00\x00\x00\x00\x0c' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
109 b'\x00\x00\x00\x08\x00\x00\x00\x05' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
110 b'\x00\x00\x00\x06\x00\x00\x00\x01' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
111 b'\x00\x00\x00\x00\x00\x00\x00\x05' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
112 b'\x00\x00\x00\x0c\x00\x00\x00\x05' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
113 b'\x00\x00\x00\n\x00\x00\x00\x01' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
114 b'\x00\x00\x00\x00\x00\x00\x00\t' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
115 ) |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
116 llc = linelog.linelog.fromdata(data) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
117 self.assertEqual( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
118 [(l.rev, l.linenum) for l in llc.annotate(1)], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
119 [(1, 0), (1, 1), (1, 2),], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
120 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
121 self.assertEqual( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
122 [(l.rev, l.linenum) for l in llc.annotate(2)], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
123 [(1, 0), (2, 1), (1, 2),], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
124 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
125 self.assertEqual( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
126 [(l.rev, l.linenum) for l in llc.annotate(3)], [(1, 0), (1, 2),] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
127 ) |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
128 # Check we emit the same bytecode. |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
129 ll = linelog.linelog() |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
130 # Initial revision: add lines 0, 1, and 2 |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
131 ll.replacelines(1, 0, 0, 0, 3) |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
132 # Replace line 1 with a new line |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
133 ll.replacelines(2, 1, 2, 1, 2) |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
134 # delete a line out of 2 |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
135 ll.replacelines(3, 1, 2, 0, 0) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
136 diff = '\n ' + '\n '.join( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
137 difflib.unified_diff( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
138 ll.debugstr().splitlines(), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
139 llc.debugstr().splitlines(), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
140 'python', |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
141 'c', |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
142 lineterm='', |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
143 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
144 ) |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
145 self.assertEqual(ll._program, llc._program, 'Program mismatch: ' + diff) |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
146 # Done as a secondary step so we get a better result if the |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
147 # program is where the mismatch is. |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
148 self.assertEqual(ll, llc) |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
149 self.assertEqual(ll.encode(), data) |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
150 |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
151 def testanothersimplecase(self): |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
152 ll = linelog.linelog() |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
153 ll.replacelines(3, 0, 0, 0, 2) |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
154 ll.replacelines(4, 0, 2, 0, 0) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
155 self.assertEqual([(l.rev, l.linenum) for l in ll.annotate(4)], []) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
156 self.assertEqual( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
157 [(l.rev, l.linenum) for l in ll.annotate(3)], [(3, 0), (3, 1)] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
158 ) |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
159 # rev 2 is empty because contents were only ever introduced in rev 3 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
160 self.assertEqual([(l.rev, l.linenum) for l in ll.annotate(2)], []) |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
161 |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
162 def testrandomedits(self): |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
163 # Inspired by original linelog tests. |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
164 seed = random.random() |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
165 numrevs = 2000 |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
166 ll = linelog.linelog() |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
167 # Populate linelog |
38963
6fed8b323651
linelog: add replacelines_vec for fastannotate
Augie Fackler <augie@google.com>
parents:
38849
diff
changeset
|
168 for lines, rev, a1, a2, b1, b2, blines, usevec in _genedits( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
169 seed, numrevs |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
170 ): |
38963
6fed8b323651
linelog: add replacelines_vec for fastannotate
Augie Fackler <augie@google.com>
parents:
38849
diff
changeset
|
171 if usevec: |
6fed8b323651
linelog: add replacelines_vec for fastannotate
Augie Fackler <augie@google.com>
parents:
38849
diff
changeset
|
172 ll.replacelines_vec(rev, a1, a2, blines) |
6fed8b323651
linelog: add replacelines_vec for fastannotate
Augie Fackler <augie@google.com>
parents:
38849
diff
changeset
|
173 else: |
6fed8b323651
linelog: add replacelines_vec for fastannotate
Augie Fackler <augie@google.com>
parents:
38849
diff
changeset
|
174 ll.replacelines(rev, a1, a2, b1, b2) |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
175 ar = ll.annotate(rev) |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
176 self.assertEqual(ll.annotateresult, lines) |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
177 # Verify we can get back these states by annotating each rev |
38963
6fed8b323651
linelog: add replacelines_vec for fastannotate
Augie Fackler <augie@google.com>
parents:
38849
diff
changeset
|
178 for lines, rev, a1, a2, b1, b2, blines, usevec in _genedits( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
179 seed, numrevs |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
180 ): |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
181 ar = ll.annotate(rev) |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
182 self.assertEqual([(l.rev, l.linenum) for l in ar], lines) |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
183 |
38973
27a54096c92e
linelog: fix infinite loop vulnerability
Jun Wu <quark@fb.com>
parents:
38963
diff
changeset
|
184 def testinfinitebadprogram(self): |
27a54096c92e
linelog: fix infinite loop vulnerability
Jun Wu <quark@fb.com>
parents:
38963
diff
changeset
|
185 ll = linelog.linelog.fromdata( |
27a54096c92e
linelog: fix infinite loop vulnerability
Jun Wu <quark@fb.com>
parents:
38963
diff
changeset
|
186 b'\x00\x00\x00\x00\x00\x00\x00\x02' # header |
27a54096c92e
linelog: fix infinite loop vulnerability
Jun Wu <quark@fb.com>
parents:
38963
diff
changeset
|
187 b'\x00\x00\x00\x00\x00\x00\x00\x01' # JUMP to self |
27a54096c92e
linelog: fix infinite loop vulnerability
Jun Wu <quark@fb.com>
parents:
38963
diff
changeset
|
188 ) |
27a54096c92e
linelog: fix infinite loop vulnerability
Jun Wu <quark@fb.com>
parents:
38963
diff
changeset
|
189 with self.assertRaises(linelog.LineLogError): |
27a54096c92e
linelog: fix infinite loop vulnerability
Jun Wu <quark@fb.com>
parents:
38963
diff
changeset
|
190 # should not be an infinite loop and raise |
27a54096c92e
linelog: fix infinite loop vulnerability
Jun Wu <quark@fb.com>
parents:
38963
diff
changeset
|
191 ll.annotate(1) |
27a54096c92e
linelog: fix infinite loop vulnerability
Jun Wu <quark@fb.com>
parents:
38963
diff
changeset
|
192 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
193 |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
194 if __name__ == '__main__': |
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
195 import silenttestrunner |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41387
diff
changeset
|
196 |
38835
422d661056be
linelog: add a Python implementation of the linelog datastructure
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
197 silenttestrunner.main(__name__) |