github.com/cilki/sh@v2.6.4+incompatible/syntax/expand_test.go (about)

     1  // Copyright (c) 2018, Daniel Martí <mvdan@mvdan.cc>
     2  // See LICENSE for licensing information
     3  
     4  package syntax
     5  
     6  import (
     7  	"bytes"
     8  	"fmt"
     9  	"testing"
    10  )
    11  
    12  var braceTests = []struct {
    13  	in   *Word
    14  	want []*Word
    15  }{
    16  	{
    17  		litWord("a{b"),
    18  		litWords("a{b"),
    19  	},
    20  	{
    21  		litWord("a}b"),
    22  		litWords("a}b"),
    23  	},
    24  	{
    25  		litWord("{a,b{c,d}"),
    26  		litWords("{a,bc", "{a,bd"),
    27  	},
    28  	{
    29  		litWord("{a{b"),
    30  		litWords("{a{b"),
    31  	},
    32  	{
    33  		litWord("a{}"),
    34  		litWords("a{}"),
    35  	},
    36  	{
    37  		litWord("a{b}"),
    38  		litWords("a{b}"),
    39  	},
    40  	{
    41  		litWord("a{b,c}"),
    42  		litWords("ab", "ac"),
    43  	},
    44  	{
    45  		litWord("a{à,世界}"),
    46  		litWords("aà", "a世界"),
    47  	},
    48  	{
    49  		litWord("a{b,c}d{e,f}g"),
    50  		litWords("abdeg", "abdfg", "acdeg", "acdfg"),
    51  	},
    52  	{
    53  		litWord("a{b{x,y},c}d"),
    54  		litWords("abxd", "abyd", "acd"),
    55  	},
    56  	{
    57  		litWord("a{1,2,3,4,5}"),
    58  		litWords("a1", "a2", "a3", "a4", "a5"),
    59  	},
    60  	{
    61  		litWord("a{1.."),
    62  		litWords("a{1.."),
    63  	},
    64  	{
    65  		litWord("a{1..4"),
    66  		litWords("a{1..4"),
    67  	},
    68  	{
    69  		litWord("a{1.4}"),
    70  		litWords("a{1.4}"),
    71  	},
    72  	{
    73  		litWord("{a,b}{1..4"),
    74  		litWords("a{1..4", "b{1..4"),
    75  	},
    76  	{
    77  		litWord("a{1..4}"),
    78  		litWords("a1", "a2", "a3", "a4"),
    79  	},
    80  	{
    81  		litWord("a{1..2}b{4..5}c"),
    82  		litWords("a1b4c", "a1b5c", "a2b4c", "a2b5c"),
    83  	},
    84  	{
    85  		litWord("a{1..f}"),
    86  		litWords("a{1..f}"),
    87  	},
    88  	{
    89  		litWord("a{c..f}"),
    90  		litWords("ac", "ad", "ae", "af"),
    91  	},
    92  	{
    93  		litWord("a{-..f}"),
    94  		litWords("a{-..f}"),
    95  	},
    96  	{
    97  		litWord("a{3..-}"),
    98  		litWords("a{3..-}"),
    99  	},
   100  	{
   101  		litWord("a{1..10..3}"),
   102  		litWords("a1", "a4", "a7", "a10"),
   103  	},
   104  	{
   105  		litWord("a{1..4..0}"),
   106  		litWords("a1", "a2", "a3", "a4"),
   107  	},
   108  	{
   109  		litWord("a{4..1}"),
   110  		litWords("a4", "a3", "a2", "a1"),
   111  	},
   112  	{
   113  		litWord("a{4..1..-2}"),
   114  		litWords("a4", "a2"),
   115  	},
   116  	{
   117  		litWord("a{4..1..1}"),
   118  		litWords("a4", "a3", "a2", "a1"),
   119  	},
   120  	{
   121  		litWord("a{d..k..3}"),
   122  		litWords("ad", "ag", "aj"),
   123  	},
   124  	{
   125  		litWord("a{d..k..n}"),
   126  		litWords("a{d..k..n}"),
   127  	},
   128  	{
   129  		litWord("a{k..d..-2}"),
   130  		litWords("ak", "ai", "ag", "ae"),
   131  	},
   132  }
   133  
   134  func TestExpandBraces(t *testing.T) {
   135  	t.Parallel()
   136  	for i, tc := range braceTests {
   137  		t.Run(fmt.Sprintf("%02d", i), func(t *testing.T) {
   138  			inStr := printWords(tc.in)
   139  			got := ExpandBraces(tc.in)
   140  			gotStr := printWords(got...)
   141  			wantStr := printWords(tc.want...)
   142  			if gotStr != wantStr {
   143  				t.Fatalf("mismatch in %q\nwant:\n%s\ngot: %s",
   144  					inStr, wantStr, gotStr)
   145  			}
   146  
   147  		})
   148  	}
   149  }
   150  
   151  func printWords(words ...*Word) string {
   152  	p := NewPrinter()
   153  	var buf bytes.Buffer
   154  	var f File
   155  	f.Stmts = append(f.Stmts, stmt(call(words...)))
   156  	p.Print(&buf, &f)
   157  	return buf.String()
   158  }