(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:test_description) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:'Test diff/status color escape codes' span_id:15))} spids: [13] ) ] ) (C {(.)} {(./test-lib.sh)}) (command.ShFunction name: color body: (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp] children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:actual) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:31) command_list: (command.CommandList children: [ (C {(git)} {(config)} {(--get-color)} {(no.such.slot)} {(DQ ($ Id.VSub_Number '$1'))} ) ] ) ) } spids: [30] ) ] ) (C {(test)} {(DQ ($ Id.VSub_DollarName '$actual'))} {(Id.Lit_Equals '=')} {(DQ ('\x1b') ($ Id.VSub_Number '$2'))} ) ] ) ] ) ) (command.ShFunction name: invalid_color body: (command.BraceGroup children: [ (C {(test_must_fail)} {(git)} {(config)} {(--get-color)} {(no.such.slot)} {(DQ ($ Id.VSub_Number '$1'))} ) ] ) ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:reset span_id:91))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:95) (Token id:Id.Lit_Chars val:'\tcolor "reset" "[m"\n' span_id:96) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'attribute before color name' span_id:103))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:107) (Token id:Id.Lit_Chars val:'\tcolor "bold red" "[1;31m"\n' span_id:108) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'color name before attribute' span_id:115))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:119) (Token id:Id.Lit_Chars val:'\tcolor "red bold" "[1;31m"\n' span_id:120) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'attr fg bg' span_id:127))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:131) (Token id:Id.Lit_Chars val:'\tcolor "ul blue red" "[4;34;41m"\n' span_id:132) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'fg attr bg' span_id:139))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:143) (Token id:Id.Lit_Chars val:'\tcolor "blue ul red" "[4;34;41m"\n' span_id:144) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'fg bg attr' span_id:151))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:155) (Token id:Id.Lit_Chars val:'\tcolor "blue red ul" "[4;34;41m"\n' span_id:156) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'fg bg attr...' span_id:163))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:167) (Token id: Id.Lit_Chars val: '\tcolor "blue bold dim ul blink reverse" "[1;2;4;5;7;34m"\n' span_id: 168 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'attr negation' span_id:178))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:182) (Token id: Id.Lit_Chars val: '\tcolor "nobold nodim noul noblink noreverse" "[22;24;25;27m"\n' span_id: 183 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'"no-" variant of negation' span_id:190))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:194) (Token id:Id.Lit_Chars val:'\tcolor "no-bold no-blink" "[22;25m"\n' span_id:195) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'long color specification' span_id:202))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:206) (Token id: Id.Lit_Chars val: '\tcolor "254 255 bold dim ul blink reverse" "[1;2;4;5;7;38;5;254;48;5;255m"\n' span_id: 207 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'absurdly long color specification' span_id:214))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:218) (Token id:Id.Lit_Chars val:'\tcolor \\\n' span_id:219) (Token id: Id.Lit_Chars val: '\t "#ffffff #ffffff bold nobold dim nodim italic noitalic\n' span_id: 220 ) (Token id: Id.Lit_Chars val: '\t ul noul blink noblink reverse noreverse strike nostrike" \\\n' span_id: 221 ) (Token id: Id.Lit_Chars val: '\t "[1;2;3;4;5;7;9;22;23;24;25;27;29;38;2;255;255;255;48;2;255;255;255m"\n' span_id: 222 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'0-7 are aliases for basic ANSI color names' span_id:229))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:233) (Token id:Id.Lit_Chars val:'\tcolor "0 7" "[30;47m"\n' span_id:234) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'256 colors' span_id:241))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:245) (Token id: Id.Lit_Chars val: '\tcolor "254 bold 255" "[1;38;5;254;48;5;255m"\n' span_id: 246 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'24-bit colors' span_id:253))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:257) (Token id: Id.Lit_Chars val: '\tcolor "#ff00ff black" "[38;2;255;0;255;40m"\n' span_id: 258 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'"normal" yields no color at all"' span_id:265))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:269) (Token id:Id.Lit_Chars val:'\tcolor "normal black" "[40m"\n' span_id:270) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'-1 is a synonym for "normal"' span_id:277))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:281) (Token id:Id.Lit_Chars val:'\tcolor "-1 black" "[40m"\n' span_id:282) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'color too small' span_id:289))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:293) (Token id:Id.Lit_Chars val:'\tinvalid_color "-2"\n' span_id:294) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'color too big' span_id:301))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:305) (Token id:Id.Lit_Chars val:'\tinvalid_color "256"\n' span_id:306) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'extra character after color number' span_id:313))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:317) (Token id:Id.Lit_Chars val:'\tinvalid_color "3X"\n' span_id:318) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'extra character after color name' span_id:325))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:329) (Token id:Id.Lit_Chars val:'\tinvalid_color "redX"\n' span_id:330) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'extra character after attribute' span_id:337))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:341) (Token id:Id.Lit_Chars val:'\tinvalid_color "dimX"\n' span_id:342) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'unknown color slots are ignored (diff)' span_id:349))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:353) (Token id: Id.Lit_Chars val: '\tgit config color.diff.nosuchslotwilleverbedefined white &&\n' span_id: 354 ) (Token id:Id.Lit_Chars val:'\tgit diff --color\n' span_id:355) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'unknown color slots are ignored (branch)' span_id:362))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:366) (Token id: Id.Lit_Chars val: '\tgit config color.branch.nosuchslotwilleverbedefined white &&\n' span_id: 367 ) (Token id:Id.Lit_Chars val:'\tgit branch -a\n' span_id:368) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'unknown color slots are ignored (status)' span_id:375))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:379) (Token id: Id.Lit_Chars val: '\tgit config color.status.nosuchslotwilleverbedefined white &&\n' span_id: 380 ) (Token id:Id.Lit_Chars val:'\t{ git status; ret=$?; } &&\n' span_id:381) (Token id: Id.Lit_Chars val: '\tcase $ret in 0|1) : ok ;; *) false ;; esac\n' span_id: 382 ) ) } ) (C {(test_done)}) ] )