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 }