(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)})
  ]
)