github.com/misseven0/notify@v0.0.0-20230519123055-c1422e46da05/watchpoint_test.go (about) 1 // Copyright (c) 2014-2015 The Notify Authors. All rights reserved. 2 // Use of this source code is governed by the MIT license that can be 3 // found in the LICENSE file. 4 5 package notify 6 7 import ( 8 "fmt" 9 "reflect" 10 "testing" 11 ) 12 13 func call(wp watchpoint, fn interface{}, args []interface{}) eventDiff { 14 vals := []reflect.Value{reflect.ValueOf(wp)} 15 for _, arg := range args { 16 vals = append(vals, reflect.ValueOf(arg)) 17 } 18 res := reflect.ValueOf(fn).Call(vals) 19 if n := len(res); n != 1 { 20 panic(fmt.Sprintf("unexpected len(res)=%d", n)) 21 } 22 diff, ok := res[0].Interface().(eventDiff) 23 if !ok { 24 panic(fmt.Sprintf("want typeof(diff)=EventDiff; got %T", res[0].Interface())) 25 } 26 return diff 27 } 28 29 func TestWatchpoint(t *testing.T) { 30 ch := NewChans(5) 31 all := All | recursive 32 cases := [...]struct { 33 fn interface{} 34 args []interface{} 35 diff eventDiff 36 total Event 37 }{ 38 // i=0 39 { 40 watchpoint.Add, 41 []interface{}{ch[0], Remove}, 42 eventDiff{0, Remove}, 43 Remove, 44 }, 45 // i=1 46 { 47 watchpoint.Add, 48 []interface{}{ch[1], Create | Remove | recursive}, 49 eventDiff{Remove, Remove | Create}, 50 Create | Remove | recursive, 51 }, 52 // i=2 53 { 54 watchpoint.Add, 55 []interface{}{ch[2], Create | Rename}, 56 eventDiff{Create | Remove, Create | Remove | Rename}, 57 Create | Remove | Rename | recursive, 58 }, 59 // i=3 60 { 61 watchpoint.Add, 62 []interface{}{ch[0], Write | recursive}, 63 eventDiff{Create | Remove | Rename, Create | Remove | Rename | Write}, 64 Create | Remove | Rename | Write | recursive, 65 }, 66 // i=4 67 { 68 watchpoint.Add, 69 []interface{}{ch[2], Remove | recursive}, 70 none, 71 Create | Remove | Rename | Write | recursive, 72 }, 73 // i=5 74 { 75 watchpoint.Del, 76 []interface{}{ch[0], all}, 77 eventDiff{Create | Remove | Rename | Write, Create | Remove | Rename}, 78 Create | Remove | Rename | recursive, 79 }, 80 // i=6 81 { 82 watchpoint.Del, 83 []interface{}{ch[2], all}, 84 eventDiff{Create | Remove | Rename, Create | Remove}, 85 Create | Remove | recursive, 86 }, 87 // i=7 88 { 89 watchpoint.Add, 90 []interface{}{ch[3], Create | Remove}, 91 none, 92 Create | Remove | recursive, 93 }, 94 // i=8 95 { 96 watchpoint.Del, 97 []interface{}{ch[1], all}, 98 none, 99 Create | Remove, 100 }, 101 // i=9 102 { 103 watchpoint.Add, 104 []interface{}{ch[3], recursive | Write}, 105 eventDiff{Create | Remove, Create | Remove | Write}, 106 Create | Remove | Write | recursive, 107 }, 108 // i=10 109 { 110 watchpoint.Del, 111 []interface{}{ch[3], Create}, 112 eventDiff{Create | Remove | Write, Remove | Write}, 113 Remove | Write | recursive, 114 }, 115 // i=11 116 { 117 watchpoint.Add, 118 []interface{}{ch[3], Create | Rename}, 119 eventDiff{Remove | Write, Create | Remove | Rename | Write}, 120 Create | Remove | Rename | Write | recursive, 121 }, 122 // i=12 123 { 124 watchpoint.Add, 125 []interface{}{ch[2], Remove | Write}, 126 none, 127 Create | Remove | Rename | Write | recursive, 128 }, 129 // i=13 130 { 131 watchpoint.Del, 132 []interface{}{ch[3], Create | Remove | Write}, 133 eventDiff{Create | Remove | Rename | Write, Remove | Rename | Write}, 134 Remove | Rename | Write | recursive, 135 }, 136 // i=14 137 { 138 watchpoint.Del, 139 []interface{}{ch[2], Remove}, 140 eventDiff{Remove | Rename | Write, Rename | Write}, 141 Rename | Write | recursive, 142 }, 143 // i=15 144 { 145 watchpoint.Del, 146 []interface{}{ch[3], Rename | recursive}, 147 eventDiff{Rename | Write, Write}, 148 Write, 149 }, 150 } 151 wp := watchpoint{} 152 for i, cas := range cases { 153 if diff := call(wp, cas.fn, cas.args); diff != cas.diff { 154 t.Errorf("want diff=%v; got %v (i=%d)", cas.diff, diff, i) 155 continue 156 } 157 if total := wp[nil]; total != cas.total { 158 t.Errorf("want total=%v; got %v (i=%d)", cas.total, total, i) 159 continue 160 } 161 } 162 }