forked from antlr/antlr4
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathBitSetSpec.js
110 lines (98 loc) · 2.83 KB
/
BitSetSpec.js
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
import BitSet from "../src/antlr4/misc/BitSet.js";
describe('test BitSet', () => {
it("is empty", () => {
const bs = new BitSet();
expect(bs.length).toEqual(0);
})
it("sets 1 value", () => {
const bs = new BitSet();
bs.set(67);
expect(bs.length).toEqual(1);
expect(bs.get(67)).toBeTrue();
})
it("clears 1 value", () => {
const bs = new BitSet();
bs.set(67);
bs.clear(67)
expect(bs.length).toEqual(0);
expect(bs.get(67)).toBeFalse();
})
it("sets 2 consecutive values", () => {
const bs = new BitSet();
bs.set(67);
bs.set(68);
expect(bs.length).toEqual(2);
expect(bs.get(67)).toBeTrue();
expect(bs.get(68)).toBeTrue();
})
it("sets 2 close values", () => {
const bs = new BitSet();
bs.set(67);
bs.set(70);
expect(bs.length).toEqual(2);
expect(bs.get(67)).toBeTrue();
expect(bs.get(70)).toBeTrue();
})
it("sets 2 distant values", () => {
const bs = new BitSet();
bs.set(67);
bs.set(241);
expect(bs.length).toEqual(2);
expect(bs.get(67)).toBeTrue();
expect(bs.get(241)).toBeTrue();
})
it("combines 2 identical sets", () => {
const bs1 = new BitSet();
bs1.set(67);
const bs2 = new BitSet();
bs2.set(67);
bs1.or(bs2);
expect(bs1.length).toEqual(1);
expect(bs1.get(67)).toBeTrue();
})
it("combines 2 distinct sets", () => {
const bs1 = new BitSet();
bs1.set(67);
const bs2 = new BitSet();
bs2.set(69);
bs1.or(bs2);
expect(bs1.length).toEqual(2);
expect(bs1.get(67)).toBeTrue();
expect(bs1.get(69)).toBeTrue();
})
it("combines 2 overlapping sets", () => {
const bs1 = new BitSet();
bs1.set(67);
bs1.set(69);
const bs2 = new BitSet();
bs2.set(69);
bs2.set(71);
bs1.or(bs2);
expect(bs1.length).toEqual(3);
expect(bs1.get(67)).toBeTrue();
expect(bs1.get(69)).toBeTrue();
expect(bs1.get(71)).toBeTrue();
})
it("returns values", () => {
const bs = new BitSet();
bs.set(67);
bs.set(69);
const values = bs.values();
expect(values).toEqual([67, 69]);
})
it("counts bits", () => {
for(let i= 0; i <= 0xFF; i++) {
// count bits the slow but easy to understand way (Kernighan method)
let count1 = 0;
let value = i;
while(value) {
if(value & 1)
count1++;
value >>= 1;
}
// count bits the fast way
const count2 = BitSet._bitCount(i);
expect(count2).toEqual(count1);
}
})
})