github.com/vugu/vugu@v0.3.6-0.20240430171613-3f6f402e014b/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  }