github.com/anchore/syft@v1.4.2-0.20240516191711-1bec1fc5d397/syft/pkg/cataloger/erlang/erlang_parser_test.go (about)

     1  package erlang
     2  
     3  import (
     4  	"bytes"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  func Test_parseErlang(t *testing.T) {
    12  	tests := []struct {
    13  		name    string
    14  		content string
    15  		wantErr require.ErrorAssertionFunc
    16  	}{
    17  		{
    18  			name: "basic valid content",
    19  			content: `
    20  {"1.2.0",
    21  [{<<"bcrypt">>,{pkg,<<"bcrypt">>,<<"1.1.5">>},0},
    22   {<<"bson">>,
    23    {git,"https://github.com/comtihon/bson-erlang",
    24         {ref,"14308ab927cfa69324742c3de720578094e0bb19"}},
    25    1},
    26   {<<"syslog">>,{pkg,<<"syslog">>,<<"1.1.0">>},0},
    27   {<<"unicode_util_compat">>,{pkg,<<"unicode_util_compat">>,<<"0.7.0">>},1},
    28   {<<"vernemq_dev">>,
    29    {git,"https://github.com/vernemq/vernemq_dev.git",
    30         {ref,"6d622aa8c901ae7777433aef2bd049e380c474a6"}},
    31    0}]
    32  }.
    33  [
    34  {pkg_hash,[
    35   {<<"bcrypt">>, <<"A6763BD4E1AF46D34776F85B7995E63A02978DE110C077E9570ED17006E03386">>},
    36   {<<"unicode_util_compat">>, <<"BC84380C9AB48177092F43AC89E4DFA2C6D62B40B8BD132B1059ECC7232F9A78">>}]},
    37  {pkg_hash_ext,[
    38   {<<"bcrypt">>, <<"3418821BC17CE6E96A4A77D1A88D7485BF783E212069FACFC79510AFBFF95352">>},
    39   {<<"unicode_util_compat">>, <<"25EEE6D67DF61960CF6A794239566599B09E17E668D3700247BC498638152521">>}]}
    40  ].`,
    41  		},
    42  		{
    43  			name: "empty list",
    44  			content: `
    45  {test, [
    46   {with_space, [ ]},
    47   {without_space, []}
    48  ]}`,
    49  		},
    50  		{
    51  			name: "valid strings",
    52  			content: `
    53  {strings, [
    54   "foo", 'bar'
    55  ]}`,
    56  		},
    57  		{
    58  			name:    "invalid string content",
    59  			wantErr: require.Error,
    60  			content: `
    61  {"1.2.0
    62  ">>},
    63  ].`,
    64  		},
    65  		{
    66  			name:    "string mismach",
    67  			wantErr: require.Error,
    68  			content: `
    69  {bad_string, [
    70   'foo"
    71   ]}`,
    72  		},
    73  		{
    74  			name:    "invalid content",
    75  			wantErr: require.Error,
    76  			content: `
    77  {"1.2.0"}.
    78  ].`,
    79  		},
    80  		{
    81  			name: "valid comments",
    82  			content: `
    83  { comments, [
    84  	{ foo, bar },
    85  	%% this is a comment
    86  	% this is also a comment
    87  	{ hello, 'bar' }, %%inline comment
    88  	{ baz }
    89  ]}`,
    90  		},
    91  		{
    92  			name: "starts with a comments",
    93  			content: `
    94  %% starts with comment
    95  { comments, [
    96  	{ foo, bar }
    97  ]}`,
    98  		},
    99  	}
   100  
   101  	for _, test := range tests {
   102  		t.Run(test.name, func(t *testing.T) {
   103  			value, err := parseErlang(bytes.NewReader([]byte(test.content)))
   104  
   105  			if test.wantErr == nil {
   106  				require.NoError(t, err)
   107  			} else {
   108  				test.wantErr(t, err)
   109  			}
   110  
   111  			assert.IsType(t, erlangNode{}, value)
   112  		})
   113  	}
   114  }