github.com/vugu/vugu@v0.3.5/gen/parser-go_test.go (about) 1 package gen 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 "github.com/stretchr/testify/require" 8 "github.com/vugu/html" 9 ) 10 11 func TestEmitForExpr(t *testing.T) { 12 tests := []struct { 13 name string 14 node *html.Node 15 expectedError string 16 expectedResult string 17 }{ 18 { 19 name: "no vg-for attributes", 20 node: &html.Node{}, 21 expectedError: "no for expression, code should not be calling emitForExpr when no vg-for is present", 22 }, 23 { 24 name: "no iteration vars", 25 node: &html.Node{ 26 Attr: []html.Attribute{ 27 {Key: "vg-for", Val: "c.Items"}, 28 }, 29 }, 30 expectedResult: `for key, value := range c.Items { 31 var vgiterkey interface{} = key 32 _ = vgiterkey 33 key := key 34 _ = key 35 value := value 36 _ = value 37 `, 38 }, 39 { 40 name: "no iteration vars noshadow", 41 node: &html.Node{ 42 Attr: []html.Attribute{ 43 {Key: "vg-for.noshadow", Val: "c.Items"}, 44 }, 45 }, 46 expectedResult: `for key, value := range c.Items { 47 var vgiterkey interface{} = key 48 _ = vgiterkey 49 `, 50 }, 51 { 52 name: "no iteration vars with vg-key", 53 node: &html.Node{ 54 Attr: []html.Attribute{ 55 {Key: "vg-for", Val: "c.Items"}, 56 {Key: "vg-key", Val: "1"}, 57 }, 58 }, 59 expectedResult: `for key, value := range c.Items { 60 var vgiterkey interface{} = 1 61 _ = vgiterkey 62 key := key 63 _ = key 64 value := value 65 _ = value 66 `, 67 }, 68 { 69 name: "key and value vars", 70 node: &html.Node{ 71 Attr: []html.Attribute{ 72 {Key: "vg-for", Val: "k, v := range c.Items"}, 73 }, 74 }, 75 expectedResult: `for k, v := range c.Items { 76 var vgiterkey interface{} = k 77 _ = vgiterkey 78 k := k 79 _ = k 80 v := v 81 _ = v 82 `, 83 }, 84 { 85 name: "key and value vars noshadow", 86 node: &html.Node{ 87 Attr: []html.Attribute{ 88 {Key: "vg-for.noshadow", Val: "k, v := range c.Items"}, 89 }, 90 }, 91 expectedResult: `for k, v := range c.Items { 92 var vgiterkey interface{} = k 93 _ = vgiterkey 94 `, 95 }, 96 { 97 name: "only key var", 98 node: &html.Node{ 99 Attr: []html.Attribute{ 100 {Key: "vg-for", Val: "k := range c.Items"}, 101 }, 102 }, 103 expectedResult: `for k := range c.Items { 104 var vgiterkey interface{} = k 105 _ = vgiterkey 106 k := k 107 _ = k 108 `, 109 }, 110 { 111 name: "only key var noshadow", 112 node: &html.Node{ 113 Attr: []html.Attribute{ 114 {Key: "vg-for.noshadow", Val: "k := range c.Items"}, 115 }, 116 }, 117 expectedResult: `for k := range c.Items { 118 var vgiterkey interface{} = k 119 _ = vgiterkey 120 `, 121 }, 122 { 123 name: "only key var with vg-key", 124 node: &html.Node{ 125 Attr: []html.Attribute{ 126 {Key: "vg-for", Val: "k := range c.Items"}, 127 {Key: "vg-key", Val: "1"}, 128 }, 129 }, 130 expectedResult: `for k := range c.Items { 131 var vgiterkey interface{} = 1 132 _ = vgiterkey 133 k := k 134 _ = k 135 `, 136 }, 137 { 138 name: "only value var", 139 node: &html.Node{ 140 Attr: []html.Attribute{ 141 {Key: "vg-for", Val: "_, v := range c.Items"}, 142 }, 143 }, 144 expectedResult: `for vgiterkeyt , v := range c.Items { 145 var vgiterkey interface{} = vgiterkeyt 146 _ = vgiterkey 147 v := v 148 _ = v 149 `, 150 }, 151 { 152 name: "only value var noshadow", 153 node: &html.Node{ 154 Attr: []html.Attribute{ 155 {Key: "vg-for.noshadow", Val: "_, v := range c.Items"}, 156 }, 157 }, 158 expectedResult: `for vgiterkeyt , v := range c.Items { 159 var vgiterkey interface{} = vgiterkeyt 160 _ = vgiterkey 161 `, 162 }, 163 { 164 name: "only value var with vg-key", 165 node: &html.Node{ 166 Attr: []html.Attribute{ 167 {Key: "vg-for", Val: "_, v := range c.Items"}, 168 {Key: "vg-key", Val: "1"}, 169 }, 170 }, 171 expectedResult: `for _, v := range c.Items { 172 var vgiterkey interface{} = 1 173 _ = vgiterkey 174 v := v 175 _ = v 176 `, 177 }, 178 { 179 name: "iteration with for clause", 180 node: &html.Node{ 181 Attr: []html.Attribute{ 182 {Key: "vg-for", Val: "i:= 0; i < 5; i++"}, 183 }, 184 }, 185 expectedResult: `for i:= 0; i < 5; i++ { 186 var vgiterkey interface{} = i 187 _ = vgiterkey 188 i := i 189 _ = i 190 `, 191 }, 192 { 193 name: "iteration with for clause noshadow", 194 node: &html.Node{ 195 Attr: []html.Attribute{ 196 {Key: "vg-for.noshadow", Val: "i:= 0; i < 5; i++"}, 197 }, 198 }, 199 expectedResult: `for i:= 0; i < 5; i++ { 200 var vgiterkey interface{} = i 201 _ = vgiterkey 202 `, 203 }, 204 { 205 name: "iteration with for clause with vg-key", 206 node: &html.Node{ 207 Attr: []html.Attribute{ 208 {Key: "vg-for", Val: "i:= 0; i < 5; i++"}, 209 {Key: "vg-key", Val: "1"}, 210 }, 211 }, 212 expectedResult: `for i:= 0; i < 5; i++ { 213 var vgiterkey interface{} = 1 214 _ = vgiterkey 215 i := i 216 _ = i 217 `, 218 }, 219 } 220 for _, tt := range tests { 221 t.Run(tt.name, func(t *testing.T) { 222 assert := assert.New(t) 223 require := require.New(t) 224 pg := &ParserGo{} 225 state := &parseGoState{} 226 227 err := pg.emitForExpr(state, tt.node) 228 229 if tt.expectedError != "" { 230 require.EqualError(err, tt.expectedError) 231 return 232 } 233 require.NoError(err) 234 assert.Exactly(tt.expectedResult, state.buildBuf.String()) 235 }) 236 } 237 }