github.com/NeowayLabs/nash@v0.2.2-0.20200127205349-a227041ffd50/parser/parse_fmt_test.go (about)

     1  package parser
     2  
     3  import "testing"
     4  
     5  type fmtTestTable struct {
     6  	input, expected string
     7  }
     8  
     9  func testFmt(input string, expected string, t *testing.T) {
    10  	p := NewParser("fmt test", input)
    11  
    12  	tree, err := p.Parse()
    13  
    14  	if err != nil {
    15  		t.Error(err)
    16  		return
    17  	}
    18  
    19  	fmtval := tree.String()
    20  
    21  	if fmtval != expected {
    22  		t.Errorf("Fmt differ: '%s' != '%s'", fmtval, expected)
    23  		return
    24  	}
    25  }
    26  
    27  func testFmtTable(testTable []fmtTestTable, t *testing.T) {
    28  	for _, test := range testTable {
    29  		testFmt(test.input, test.expected, t)
    30  	}
    31  }
    32  
    33  func TestFmtVariables(t *testing.T) {
    34  	testTable := []fmtTestTable{
    35  
    36  		// correct adjust of spaces
    37  		{`test = "a"`, `test = "a"`},
    38  		{`test="a"`, `test = "a"`},
    39  		{`test= "a"`, `test = "a"`},
    40  		{`test  ="a"`, `test = "a"`},
    41  		{`test =    "a"`, `test = "a"`},
    42  		{`test	="a"`, `test = "a"`},
    43  		{`test		="a"`, `test = "a"`},
    44  		{`test =	"a"`, `test = "a"`},
    45  		{`test =		"a"`, `test = "a"`},
    46  		{`test = ()`, `test = ()`},
    47  		{`test=()`, `test = ()`},
    48  		{`test =()`, `test = ()`},
    49  		{`test	=()`, `test = ()`},
    50  		{`test=	()`, `test = ()`},
    51  		{`test = (plan9)`, `test = (plan9)`},
    52  		{`test=(plan9)`, `test = (plan9)`},
    53  		{`test      = (plan9)`, `test = (plan9)`},
    54  		{`test	= (plan9)`, `test = (plan9)`},
    55  		{`test	=	(plan9)`, `test = (plan9)`},
    56  		{`test = (	plan9)`, `test = (plan9)`},
    57  		{`test = (     plan9)`, `test = (plan9)`},
    58  		{`test = (plan9     )`, `test = (plan9)`},
    59  		{`test = (plan9 from bell labs)`, `test = (plan9 from bell labs)`},
    60  		{`test = (plan9         from bell labs)`, `test = (plan9 from bell labs)`},
    61  		{`test = (plan9         from         bell         labs)`, `test = (plan9 from bell labs)`},
    62  		{`test = (plan9	from	bell	labs)`, `test = (plan9 from bell labs)`},
    63  		{`test = (
    64  	plan9
    65  	from
    66  	bell
    67  	labs
    68  )`, `test = (plan9 from bell labs)`},
    69  		{`test = (plan9 from bell labs windows linux freebsd netbsd openbsd)`, `test = (
    70  	plan9
    71  	from
    72  	bell
    73  	labs
    74  	windows
    75  	linux
    76  	freebsd
    77  	netbsd
    78  	openbsd
    79  )`},
    80  
    81  		{`IFS = ("\n")`, `IFS = ("\n")`},
    82  
    83  		// multiple variables
    84  		{`test = "a"
    85  testb = "b"`, `test  = "a"
    86  testb = "b"`},
    87  	}
    88  
    89  	testFmtTable(testTable, t)
    90  }
    91  
    92  func TestFmtGroupVariables(t *testing.T) {
    93  	testTable := []fmtTestTable{
    94  		{
    95  			`test = "a"
    96  
    97  test2 = "b"
    98  
    99  fn cd() { echo "hello" }`,
   100  			`test  = "a"
   101  test2 = "b"
   102  
   103  fn cd() {
   104  	echo "hello"
   105  }`,
   106  		},
   107  		{
   108  			`#!/usr/bin/env nash
   109  echo "hello"`,
   110  			`#!/usr/bin/env nash
   111  
   112  echo "hello"`,
   113  		},
   114  	}
   115  
   116  	testFmtTable(testTable, t)
   117  }
   118  
   119  func TestFmtFn(t *testing.T) {
   120  	testTable := []fmtTestTable{
   121  		{
   122  			`fn lala() { echo hello }
   123  fn lele() { echo lele }`,
   124  			`fn lala() {
   125  	echo hello
   126  }
   127  
   128  fn lele() {
   129  	echo lele
   130  }`,
   131  		},
   132  		{
   133  			`vv = ""
   134  fn t() {
   135  	echo t
   136  }`,
   137  			`vv = ""
   138  
   139  fn t() {
   140  	echo t
   141  }`,
   142  		},
   143  	}
   144  
   145  	testFmtTable(testTable, t)
   146  }
   147  
   148  func TestFmtImports(t *testing.T) {
   149  	testTable := []fmtTestTable{
   150  		{
   151  			`import test
   152  import test
   153  
   154  import test`,
   155  			`import test
   156  import test
   157  import test`,
   158  		},
   159  		{
   160  			`import nashlib/all
   161  import klb/aws/all
   162  
   163  vpcTags = ((Name klb-vpc-example) (Env testing))
   164  `,
   165  			`import nashlib/all
   166  import klb/aws/all
   167  
   168  vpcTags = (
   169  	(Name klb-vpc-example)
   170  	(Env testing)
   171  )`,
   172  		},
   173  	}
   174  
   175  	testFmtTable(testTable, t)
   176  }
   177  
   178  func TestFmtFnComments(t *testing.T) {
   179  	testTable := []fmtTestTable{
   180  		{
   181  			`PATH = "/bin"
   182  
   183  # isolated comment
   184  
   185  # Comment for fn
   186  fn test() {
   187  	echo "hello"
   188  }
   189  `,
   190  			`PATH = "/bin"
   191  
   192  # isolated comment
   193  
   194  # Comment for fn
   195  fn test() {
   196  	echo "hello"
   197  }`,
   198  		},
   199  	}
   200  
   201  	testFmtTable(testTable, t)
   202  }
   203  
   204  func TestFmtSamples(t *testing.T) {
   205  	testTable := []fmtTestTable{
   206  		{
   207  			`#!/usr/bin/env nash
   208  import nashlib/all
   209  import klb/aws/all
   210  vpcTags = ((Name klb-vpc-example) (Env testing))
   211  igwTags = ((Name klb-igw-example) (Env testing))
   212  routeTblTags = ((Name klb-rtbl-example) (Env testing))
   213  appSubnetTags = ((Name klb-app-subnet-example) (Env testing))
   214  dbSubnetTags = ((Name klb-db-subnet-example) (Env testing))
   215  sgTags = ((Name klb-sg-example) (Env testing))
   216  fn print_resource(name, id) {
   217  	printf "Created %s: %s%s%s\n" $name $NASH_GREEN $id $NASH_RESET
   218  }
   219  fn create_prod() {
   220  	vpcid <= aws_vpc_create("10.0.0.1/16", $vpcTags)
   221  	appnet <= aws_subnet_create($vpcid, "10.0.1.0/24", $appSubnetTags)
   222  	dbnet <= aws_subnet_create($vpcid, "10.0.2.0/24", $dbSubnetTags)
   223  	igwid <= aws_igw_create($igwTags)
   224  	tblid <= aws_routetbl_create($vpcid, $routeTblTags)
   225  	aws_igw_attach($igwid, $vpcid)
   226  	aws_route2igw($tblid, "0.0.0.0/0", $igwid)
   227  	grpid <= aws_secgroup_create("klb-default-sg", "sg description", $vpcid, $sgTags)
   228  	print_resource("VPC", $vpcid)
   229  	print_resource("app subnet", $appnet)
   230  	print_resource("db subnet", $dbnet)
   231  	print_resource("Internet Gateway", $igwid)
   232  	print_resource("Routing table", $tblid)
   233  	print_resource("Security group", $grpid)
   234  }
   235  create_prod()
   236  `,
   237  			`#!/usr/bin/env nash
   238  
   239  import nashlib/all
   240  import klb/aws/all
   241  
   242  vpcTags       = (
   243  	(Name klb-vpc-example)
   244  	(Env testing)
   245  )
   246  
   247  igwTags       = (
   248  	(Name klb-igw-example)
   249  	(Env testing)
   250  )
   251  
   252  routeTblTags  = (
   253  	(Name klb-rtbl-example)
   254  	(Env testing)
   255  )
   256  
   257  appSubnetTags = (
   258  	(Name klb-app-subnet-example)
   259  	(Env testing)
   260  )
   261  
   262  dbSubnetTags  = (
   263  	(Name klb-db-subnet-example)
   264  	(Env testing)
   265  )
   266  
   267  sgTags        = (
   268  	(Name klb-sg-example)
   269  	(Env testing)
   270  )
   271  
   272  fn print_resource(name, id) {
   273  	printf "Created %s: %s%s%s\n" $name $NASH_GREEN $id $NASH_RESET
   274  }
   275  
   276  fn create_prod() {
   277  	vpcid  <= aws_vpc_create("10.0.0.1/16", $vpcTags)
   278  	appnet <= aws_subnet_create($vpcid, "10.0.1.0/24", $appSubnetTags)
   279  	dbnet  <= aws_subnet_create($vpcid, "10.0.2.0/24", $dbSubnetTags)
   280  	igwid  <= aws_igw_create($igwTags)
   281  	tblid  <= aws_routetbl_create($vpcid, $routeTblTags)
   282  
   283  	aws_igw_attach($igwid, $vpcid)
   284  	aws_route2igw($tblid, "0.0.0.0/0", $igwid)
   285  
   286  	grpid <= aws_secgroup_create("klb-default-sg", "sg description", $vpcid, $sgTags)
   287  
   288  	print_resource("VPC", $vpcid)
   289  	print_resource("app subnet", $appnet)
   290  	print_resource("db subnet", $dbnet)
   291  	print_resource("Internet Gateway", $igwid)
   292  	print_resource("Routing table", $tblid)
   293  	print_resource("Security group", $grpid)
   294  }
   295  
   296  create_prod()`,
   297  		},
   298  	}
   299  
   300  	testFmtTable(testTable, t)
   301  }
   302  
   303  func TestFmtPipes(t *testing.T) {
   304  	testTable := []fmtTestTable{
   305  		{
   306  			`echo hello | grep "he" > test`,
   307  			`echo hello | grep "he" > test`,
   308  		},
   309  		{
   310  			`(echo hello | sed "s/he/wo/g" >[1] /tmp/test >[2] /dev/null)`,
   311  			`(
   312  	echo hello |
   313  	sed "s/he/wo/g"
   314  		>[1] /tmp/test
   315  		>[2] /dev/null
   316  )`,
   317  		},
   318  		{
   319  			`choice <= (
   320                  -find $dir+"/" -maxdepth 1 |
   321                  sed "s#.*/##" |
   322                  sort |
   323                  uniq |
   324                  -fzf --exact -q "^"+$query -1 -0 --inline-info --header "select file: "
   325         )`,
   326  			`choice <= (
   327  	-find $dir+"/"
   328  		-maxdepth
   329  		1 |
   330  	sed "s#.*/##" |
   331  	sort |
   332  	uniq |
   333  	-fzf --exact
   334  		-q
   335  		"^"+$query -1
   336  		-0
   337  		--inline-info
   338  		--header "select file: "
   339  )`,
   340  		},
   341  	}
   342  
   343  	testFmtTable(testTable, t)
   344  }