1package imapserver
2
3import (
4 "testing"
5
6 "github.com/mjl-/mox/store"
7)
8
9func TestNumSetContains(t *testing.T) {
10 num := func(v uint32) *setNumber {
11 return &setNumber{v, false}
12 }
13 star := &setNumber{star: true}
14
15 check := func(v bool) {
16 t.Helper()
17 if !v {
18 t.Fatalf("bad")
19 }
20 }
21
22 ss0 := numSet{true, nil} // "$"
23 check(ss0.containsSeq(1, []store.UID{2}, []store.UID{2}))
24 check(!ss0.containsSeq(1, []store.UID{2}, []store.UID{}))
25
26 ss1 := numSet{false, []numRange{{*num(1), nil}}} // Single number 1.
27 check(ss1.containsSeq(1, []store.UID{2}, nil))
28 check(!ss1.containsSeq(2, []store.UID{1, 2}, nil))
29
30 check(ss1.containsSeq(1, []store.UID{2}, nil))
31 check(!ss1.containsSeq(2, []store.UID{1, 2}, nil))
32
33 // 2:*
34 ss2 := numSet{false, []numRange{{*num(2), star}}}
35 check(ss2.containsSeq(1, []store.UID{2}, nil))
36 check(!ss2.containsSeq(2, []store.UID{2}, nil))
37 check(ss2.containsSeq(2, []store.UID{4, 5}, nil))
38 check(ss2.containsSeq(3, []store.UID{4, 5, 6}, nil))
39 check(!ss2.containsSeq(4, []store.UID{4, 5, 6}, nil))
40
41 // *:2, same as 2:*
42 ss3 := numSet{false, []numRange{{*star, num(2)}}}
43 check(ss3.containsSeq(1, []store.UID{2}, nil))
44 check(!ss3.containsSeq(2, []store.UID{2}, nil))
45 check(ss3.containsSeq(2, []store.UID{4, 5}, nil))
46 check(ss3.containsSeq(3, []store.UID{4, 5, 6}, nil))
47 check(!ss3.containsSeq(4, []store.UID{4, 5, 6}, nil))
48}
49
50func TestNumSetInterpret(t *testing.T) {
51 parseNumSet := func(s string) numSet {
52 p := parser{upper: s}
53 return p.xnumSet0(true, false)
54 }
55
56 checkEqual := func(lastUID store.UID, a, s string) {
57 t.Helper()
58 n := parseNumSet(a).xinterpretStar(func() store.UID { return lastUID })
59 ns := n.String()
60 if ns != s {
61 t.Fatalf("%s != %s", ns, s)
62 }
63 }
64
65 checkEqual(0, "1:*", "0:1")
66 checkEqual(1, "1:*", "1")
67 checkEqual(3, "1:*", "1:3")
68 checkEqual(3, "4:*", "3:4")
69 checkEqual(3, "*:4", "3:4")
70 checkEqual(3, "*:4", "3:4")
71 checkEqual(3, "*:1", "1:3")
72 checkEqual(3, "1:*", "1:3")
73 checkEqual(3, "1,2,3", "1,2,3")
74 checkEqual(0, "1,2,3", "1,2,3")
75 checkEqual(0, "1:3", "1:3")
76 checkEqual(0, "3:1", "1:3")
77
78 iter := parseNumSet("3:1").xinterpretStar(func() store.UID { return 2 }).newIter()
79 v0, _ := iter.Next()
80 v1, _ := iter.Next()
81 v2, _ := iter.Next()
82 _, ok := iter.Next()
83 if v0 != 1 || v1 != 2 || v2 != 3 || ok {
84 t.Fatalf("got %v %v %v %v, expected 1, 2, 3 false", v0, v1, v2, ok)
85 }
86}
87