github.com/franklinhu/terraform@v0.6.9-0.20151202232446-81f7fb1e6f9e/config/lang/check_identifier_test.go (about)

     1  package lang
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/hashicorp/terraform/config/lang/ast"
     7  )
     8  
     9  func TestIdentifierCheck(t *testing.T) {
    10  	cases := []struct {
    11  		Input string
    12  		Scope ast.Scope
    13  		Error bool
    14  	}{
    15  		{
    16  			"foo",
    17  			&ast.BasicScope{},
    18  			false,
    19  		},
    20  
    21  		{
    22  			"foo ${bar} success",
    23  			&ast.BasicScope{
    24  				VarMap: map[string]ast.Variable{
    25  					"bar": ast.Variable{
    26  						Value: "baz",
    27  						Type:  ast.TypeString,
    28  					},
    29  				},
    30  			},
    31  			false,
    32  		},
    33  
    34  		{
    35  			"foo ${bar}",
    36  			&ast.BasicScope{},
    37  			true,
    38  		},
    39  
    40  		{
    41  			"foo ${rand()} success",
    42  			&ast.BasicScope{
    43  				FuncMap: map[string]ast.Function{
    44  					"rand": ast.Function{
    45  						ReturnType: ast.TypeString,
    46  						Callback: func([]interface{}) (interface{}, error) {
    47  							return "42", nil
    48  						},
    49  					},
    50  				},
    51  			},
    52  			false,
    53  		},
    54  
    55  		{
    56  			"foo ${rand()}",
    57  			&ast.BasicScope{},
    58  			true,
    59  		},
    60  
    61  		{
    62  			"foo ${rand(42)} ",
    63  			&ast.BasicScope{
    64  				FuncMap: map[string]ast.Function{
    65  					"rand": ast.Function{
    66  						ReturnType: ast.TypeString,
    67  						Callback: func([]interface{}) (interface{}, error) {
    68  							return "42", nil
    69  						},
    70  					},
    71  				},
    72  			},
    73  			true,
    74  		},
    75  
    76  		{
    77  			"foo ${rand()} ",
    78  			&ast.BasicScope{
    79  				FuncMap: map[string]ast.Function{
    80  					"rand": ast.Function{
    81  						ReturnType:   ast.TypeString,
    82  						Variadic:     true,
    83  						VariadicType: ast.TypeInt,
    84  						Callback: func([]interface{}) (interface{}, error) {
    85  							return "42", nil
    86  						},
    87  					},
    88  				},
    89  			},
    90  			false,
    91  		},
    92  
    93  		{
    94  			"foo ${rand(42)} ",
    95  			&ast.BasicScope{
    96  				FuncMap: map[string]ast.Function{
    97  					"rand": ast.Function{
    98  						ReturnType:   ast.TypeString,
    99  						Variadic:     true,
   100  						VariadicType: ast.TypeInt,
   101  						Callback: func([]interface{}) (interface{}, error) {
   102  							return "42", nil
   103  						},
   104  					},
   105  				},
   106  			},
   107  			false,
   108  		},
   109  
   110  		{
   111  			"foo ${rand(\"foo\", 42)} ",
   112  			&ast.BasicScope{
   113  				FuncMap: map[string]ast.Function{
   114  					"rand": ast.Function{
   115  						ArgTypes:     []ast.Type{ast.TypeString},
   116  						ReturnType:   ast.TypeString,
   117  						Variadic:     true,
   118  						VariadicType: ast.TypeInt,
   119  						Callback: func([]interface{}) (interface{}, error) {
   120  							return "42", nil
   121  						},
   122  					},
   123  				},
   124  			},
   125  			false,
   126  		},
   127  	}
   128  
   129  	for _, tc := range cases {
   130  		node, err := Parse(tc.Input)
   131  		if err != nil {
   132  			t.Fatalf("Error: %s\n\nInput: %s", err, tc.Input)
   133  		}
   134  
   135  		visitor := &IdentifierCheck{Scope: tc.Scope}
   136  		err = visitor.Visit(node)
   137  		if err != nil != tc.Error {
   138  			t.Fatalf("Error: %s\n\nInput: %s", err, tc.Input)
   139  		}
   140  	}
   141  }