state_test.go (3633B)
1 package state 2 3 import ( 4 "bytes" 5 "testing" 6 ) 7 8 // Check creation 9 func TestNewState(t *testing.T) { 10 st := NewState(5) 11 if len(st.Flags) != 2 { 12 t.Fatalf("invalid state flag length: %v", len(st.Flags)) 13 } 14 st = NewState(8) 15 if len(st.Flags) != 2 { 16 t.Fatalf("invalid state flag length: %v", len(st.Flags)) 17 } 18 st = NewState(17) 19 if len(st.Flags) != 4 { 20 t.Fatalf("invalid state flag length: %v", len(st.Flags)) 21 } 22 } 23 24 func TestStateflags(t *testing.T) { 25 st := NewState(9) 26 v := st.GetFlag(2) 27 if v { 28 t.Fatalf("Expected bit 2 not to be set") 29 } 30 v = st.SetFlag(2) 31 if !v { 32 t.Fatalf("Expected change to be set for bit 2") 33 } 34 v = st.GetFlag(2) 35 if !v { 36 t.Fatalf("Expected bit 2 to be set") 37 } 38 v = st.SetFlag(10) 39 if !v { 40 t.Fatalf("Expected change to be set for bit 10") 41 } 42 v = st.GetFlag(10) 43 if !v { 44 t.Fatalf("Expected bit 10 to be set") 45 } 46 v = st.ResetFlag(2) 47 if !v { 48 t.Fatalf("Expected change to be set for bit 10") 49 } 50 v = st.GetFlag(2) 51 if v { 52 t.Fatalf("Expected bit 2 not to be set") 53 } 54 v = st.GetFlag(10) 55 if !v { 56 t.Fatalf("Expected bit 10 to be set") 57 } 58 v = st.SetFlag(10) 59 if v { 60 t.Fatalf("Expected change not to be set for bit 10") 61 } 62 v = st.SetFlag(2) 63 v = st.SetFlag(16) 64 if !bytes.Equal(st.Flags[:3], []byte{0x04, 0x04, 0x01}) { 65 t.Fatalf("Expected 0x040401, got %v", st.Flags[:3]) 66 } 67 } 68 69 func TestStateFlagFromSlice(t *testing.T) { 70 st := NewState(15) 71 st.SetFlag(2) 72 v := st.GetIndex([]byte{}) 73 if v { 74 t.Fatalf("Expected no match on empty compare") 75 } 76 v = st.GetIndex([]byte{0x01}) 77 if v { 78 t.Fatalf("Expected 0x01 not to match") 79 } 80 v = st.GetIndex([]byte{0x04}) 81 if !v { 82 t.Fatalf("Expected 0x04 to match") 83 } 84 st.SetFlag(12) 85 v = st.GetIndex([]byte{0x04}) 86 if !v { 87 t.Fatalf("Expected 0x04 to match") 88 } 89 v = st.GetIndex([]byte{0x00, 0x10}) 90 if !v { 91 t.Fatalf("Expected 0x1000 to match") 92 } 93 v = st.ResetFlag(2) 94 v = st.GetIndex([]byte{0x00, 0x10}) 95 if !v { 96 t.Fatalf("Expected 0x1000 to matck") 97 } 98 } 99 100 func TestStateNavigate(t *testing.T) { 101 st := NewState(0) 102 err := st.Down("foo") 103 if err != nil { 104 t.Fatal(err) 105 } 106 err = st.Down("bar") 107 if err != nil { 108 t.Fatal(err) 109 } 110 err = st.Down("baz") 111 if err != nil { 112 t.Fatal(err) 113 } 114 115 s, i := st.Where() 116 if s != "baz" { 117 t.Fatalf("expected baz, got %s", s) 118 } 119 if i != 0 { 120 t.Fatalf("expected idx 0, got %v", i) 121 } 122 r := st.Depth() 123 if r != 2 { 124 t.Fatalf("expected depth 3, got %v", r) 125 } 126 127 s, err = st.Up() 128 if err != nil { 129 t.Fatal(err) 130 } 131 if s != "bar" { 132 t.Fatalf("expected bar, got %s", s) 133 } 134 s, i = st.Where() 135 if s != "bar" { 136 t.Fatalf("expected bar, got %s", s) 137 } 138 if i != 0 { 139 t.Fatalf("expected idx 0, got %v", i) 140 } 141 142 i, err = st.Next() 143 if err != nil { 144 t.Fatal(err) 145 } 146 if i != 1 { 147 t.Fatalf("expected idx 1, got %v", i) 148 } 149 i, err = st.Next() 150 if err != nil { 151 t.Fatal(err) 152 } 153 if i != 2 { 154 t.Fatalf("expected idx 2, got %v", i) 155 } 156 if err != nil { 157 t.Fatal(err) 158 } 159 160 s, i = st.Where() 161 if s != "bar" { 162 t.Fatalf("expected baz, got %s", s) 163 } 164 if i != 2 { 165 t.Fatalf("expected idx 2, got %v", i) 166 } 167 168 s, err = st.Up() 169 if err != nil { 170 t.Fatal(err) 171 } 172 if s != "foo" { 173 t.Fatalf("expected foo, got %s", s) 174 } 175 s, i = st.Where() 176 if s != "foo" { 177 t.Fatalf("expected foo, got %s", s) 178 } 179 if i != 0 { 180 t.Fatalf("expected idx 0, got %v", i) 181 } 182 } 183 184 func TestStateFlagMatch(t *testing.T) { 185 st := NewState(2) 186 st.SetFlag(8) 187 v := st.MatchFlag(8, true) 188 if !v { 189 t.Fatalf("unexpected flag") 190 } 191 v = st.MatchFlag(8, false) 192 if v { 193 t.Fatalf("unexpected flag") 194 } 195 196 v = st.MatchFlag(9, true) 197 if v { 198 t.Fatalf("unexpected flag") 199 } 200 v = st.MatchFlag(9, false) 201 if !v { 202 t.Fatalf("unexpected flag") 203 } 204 }