(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'Test git check-ref-format'>)}
          spids: [4]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (command.ShFunction
      name: valid_ref
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:prereq)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [22]
                )
              ]
            )
            (command.Case
              to_match: {($ Id.VSub_Number '$1')}
              arms: [
                (case_arm
                  pat_list: [
                    {<Id.Lit_LBracket '['> <A-Z> <Id.KW_Bang '!'> <Id.Lit_RBracket ']'> 
                      <Id.Lit_Star '*'>
                    }
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:prereq)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_Number '$1')}
                          spids: [40]
                        )
                      ]
                    )
                    (C {<shift>})
                  ]
                  spids: [32 37 -1 47]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:desc)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ <'ref name \''> ($ Id.VSub_Number '$1') <'\' is valid'> 
                        (braced_var_sub
                          token: <Id.VSub_Number 2>
                          suffix_op: 
                            (suffix_op.Unary
                              tok: <Id.VTest_ColonPlus ':+'>
                              arg_word: {<' with options '> ($ Id.VSub_Number '$2')}
                            )
                        )
                      )
                    }
                  spids: [50]
                )
              ]
            )
            (C {<test_expect_success>} {($ Id.VSub_DollarName '$prereq')} 
              {(DQ ($ Id.VSub_DollarName '$desc'))} 
              {
                (DQ <'\n'> <'\t\tgit check-ref-format '> ($ Id.VSub_Number '$2') <' \''> 
                  ($ Id.VSub_Number '$1') <'\'\n'> <'\t'>
                )
              }
            )
          ]
        )
    )
    (command.ShFunction
      name: invalid_ref
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:prereq)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [91]
                )
              ]
            )
            (command.Case
              to_match: {($ Id.VSub_Number '$1')}
              arms: [
                (case_arm
                  pat_list: [
                    {<Id.Lit_LBracket '['> <A-Z> <Id.KW_Bang '!'> <Id.Lit_RBracket ']'> 
                      <Id.Lit_Star '*'>
                    }
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:prereq)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_Number '$1')}
                          spids: [109]
                        )
                      ]
                    )
                    (C {<shift>})
                  ]
                  spids: [101 106 -1 116]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:desc)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ <'ref name \''> ($ Id.VSub_Number '$1') <'\' is invalid'> 
                        (braced_var_sub
                          token: <Id.VSub_Number 2>
                          suffix_op: 
                            (suffix_op.Unary
                              tok: <Id.VTest_ColonPlus ':+'>
                              arg_word: {<' with options '> ($ Id.VSub_Number '$2')}
                            )
                        )
                      )
                    }
                  spids: [119]
                )
              ]
            )
            (C {<test_expect_success>} {($ Id.VSub_DollarName '$prereq')} 
              {(DQ ($ Id.VSub_DollarName '$desc'))} 
              {
                (DQ <'\n'> <'\t\ttest_must_fail git check-ref-format '> ($ Id.VSub_Number '$2') <' \''> 
                  ($ Id.VSub_Number '$1') <'\'\n'> <'\t'>
                )
              }
            )
          ]
        )
    )
    (C {<invalid_ref>} {(SQ )})
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(SQ <'/'>)})
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(SQ <'/'>)} {<--allow-onelevel>})
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(SQ <'/'>)} {<--normalize>})
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(SQ <'/'>)} {(SQ <'--allow-onelevel --normalize'>)})
    (C {<valid_ref>} {(SQ <'foo/bar/baz'>)})
    (C {<valid_ref>} {(SQ <'foo/bar/baz'>)} {<--normalize>})
    (C {<invalid_ref>} {(SQ <'refs///heads/foo'>)})
    (C {<valid_ref>} {(SQ <'refs///heads/foo'>)} {<--normalize>})
    (C {<invalid_ref>} {(SQ <'heads/foo/'>)})
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(SQ <'/heads/foo'>)})
    (C {<valid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(SQ <'/heads/foo'>)} {<--normalize>})
    (C {<invalid_ref>} {(SQ <'///heads/foo'>)})
    (C {<valid_ref>} {(SQ <'///heads/foo'>)} {<--normalize>})
    (C {<invalid_ref>} {(SQ <'./foo'>)})
    (C {<invalid_ref>} {(SQ <'./foo/bar'>)})
    (C {<invalid_ref>} {(SQ <'foo/./bar'>)})
    (C {<invalid_ref>} {(SQ <'foo/bar/.'>)})
    (C {<invalid_ref>} {(SQ <'.refs/foo'>)})
    (C {<invalid_ref>} {(SQ <'refs/heads/foo.'>)})
    (C {<invalid_ref>} {(SQ <'heads/foo..bar'>)})
    (C {<invalid_ref>} {(SQ <'heads/foo?bar'>)})
    (C {<valid_ref>} {(SQ <'foo./bar'>)})
    (C {<invalid_ref>} {(SQ <'heads/foo.lock'>)})
    (C {<invalid_ref>} {(SQ <'heads///foo.lock'>)})
    (C {<invalid_ref>} {(SQ <'foo.lock/bar'>)})
    (C {<invalid_ref>} {(SQ <'foo.lock///bar'>)})
    (C {<valid_ref>} {(SQ <'heads/foo@bar'>)})
    (C {<invalid_ref>} {(SQ <'heads/v@{ation'>)})
    (C {<invalid_ref>} {(SQ <'heads/foo\\bar'>)})
    (C {<invalid_ref>} 
      {
        (DQ 
          (command_sub
            left_token: <Id.Left_DollarParen '$('>
            child: (C {<printf>} {(SQ <'heads/foo\\t'>)})
          )
        )
      }
    )
    (C {<invalid_ref>} 
      {
        (DQ 
          (command_sub
            left_token: <Id.Left_DollarParen '$('>
            child: (C {<printf>} {(SQ <'heads/foo\\177'>)})
          )
        )
      }
    )
    (C {<valid_ref>} 
      {
        (DQ 
          (command_sub
            left_token: <Id.Left_DollarParen '$('>
            child: (C {<printf>} {(SQ <'heads/fu\\303\\237'>)})
          )
        )
      }
    )
    (C {<valid_ref>} {(SQ <'heads/*foo/bar'>)} {<--refspec-pattern>})
    (C {<valid_ref>} {(SQ <'heads/foo*/bar'>)} {<--refspec-pattern>})
    (C {<valid_ref>} {(SQ <'heads/f*o/bar'>)} {<--refspec-pattern>})
    (C {<invalid_ref>} {(SQ <'heads/f*o*/bar'>)} {<--refspec-pattern>})
    (C {<invalid_ref>} {(SQ <'heads/foo*/bar*'>)} {<--refspec-pattern>})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ref)
          op: assign_op.Equal
          rhs: {(SQ <foo>)}
          spids: [444]
        )
      ]
    )
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--allow-onelevel>})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--refspec-pattern>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--refspec-pattern --allow-onelevel'>)})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--normalize>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--allow-onelevel --normalize'>)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ref)
          op: assign_op.Equal
          rhs: {(SQ <'foo/bar'>)}
          spids: [500]
        )
      ]
    )
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--allow-onelevel>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--refspec-pattern>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--refspec-pattern --allow-onelevel'>)})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--normalize>})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ref)
          op: assign_op.Equal
          rhs: {(SQ <'foo/*'>)}
          spids: [546]
        )
      ]
    )
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--allow-onelevel>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--refspec-pattern>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--refspec-pattern --allow-onelevel'>)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ref)
          op: assign_op.Equal
          rhs: {(SQ <'*/foo'>)}
          spids: [584]
        )
      ]
    )
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--allow-onelevel>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--refspec-pattern>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--refspec-pattern --allow-onelevel'>)})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--normalize>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--refspec-pattern --normalize'>)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ref)
          op: assign_op.Equal
          rhs: {(SQ <'foo/*/bar'>)}
          spids: [640]
        )
      ]
    )
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--allow-onelevel>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--refspec-pattern>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--refspec-pattern --allow-onelevel'>)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ref)
          op: assign_op.Equal
          rhs: {(SQ <'*'>)}
          spids: [678]
        )
      ]
    )
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--allow-onelevel>})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--refspec-pattern>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--refspec-pattern --allow-onelevel'>)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ref)
          op: assign_op.Equal
          rhs: {(SQ <'foo/*/*'>)}
          spids: [716]
        )
      ]
    )
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--refspec-pattern>})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--refspec-pattern --allow-onelevel'>)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ref)
          op: assign_op.Equal
          rhs: {(SQ <'*/foo/*'>)}
          spids: [740]
        )
      ]
    )
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--refspec-pattern>})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--refspec-pattern --allow-onelevel'>)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ref)
          op: assign_op.Equal
          rhs: {(SQ <'*/*/foo'>)}
          spids: [764]
        )
      ]
    )
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--refspec-pattern>})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--refspec-pattern --allow-onelevel'>)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ref)
          op: assign_op.Equal
          rhs: {(SQ <'/foo'>)}
          spids: [788]
        )
      ]
    )
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(DQ ($ Id.VSub_DollarName '$ref'))})
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(DQ ($ Id.VSub_DollarName '$ref'))} 
      {<--allow-onelevel>}
    )
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(DQ ($ Id.VSub_DollarName '$ref'))} 
      {<--refspec-pattern>}
    )
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(DQ ($ Id.VSub_DollarName '$ref'))} 
      {(SQ <'--refspec-pattern --allow-onelevel'>)}
    )
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--normalize>})
    (C {<valid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(DQ ($ Id.VSub_DollarName '$ref'))} 
      {(SQ <'--allow-onelevel --normalize'>)}
    )
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(DQ ($ Id.VSub_DollarName '$ref'))} 
      {(SQ <'--refspec-pattern --normalize'>)}
    )
    (C {<valid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(DQ ($ Id.VSub_DollarName '$ref'))} 
      {(SQ <'--refspec-pattern --allow-onelevel --normalize'>)}
    )
    (C {<test_expect_success>} {(DQ <'check-ref-format --branch @{-1}'>)} 
      {
        (SQ <'\n'> <'\tT=$(git write-tree) &&\n'> <'\tsha1=$(echo A | git commit-tree $T) &&\n'> 
          <'\tgit update-ref refs/heads/master $sha1 &&\n'> <'\tgit update-ref refs/remotes/origin/master $sha1 &&\n'> <'\tgit checkout master &&\n'> 
          <'\tgit checkout origin/master &&\n'> <'\tgit checkout master &&\n'> <'\trefname=$(git check-ref-format --branch @{-1}) &&\n'> 
          <'\ttest "$refname" = "$sha1" &&\n'> <'\trefname2=$(git check-ref-format --branch @{-2}) &&\n'> <'\ttest "$refname2" = master'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'check-ref-format --branch from subdir'>)} 
      {
        (SQ <'\n'> <'\tmkdir subdir &&\n'> <'\n'> <'\tT=$(git write-tree) &&\n'> 
          <'\tsha1=$(echo A | git commit-tree $T) &&\n'> <'\tgit update-ref refs/heads/master $sha1 &&\n'> 
          <'\tgit update-ref refs/remotes/origin/master $sha1 &&\n'> <'\tgit checkout master &&\n'> <'\tgit checkout origin/master &&\n'> <'\tgit checkout master &&\n'> 
          <'\trefname=$(\n'> <'\t\tcd subdir &&\n'> <'\t\tgit check-ref-format --branch @{-1}\n'> <'\t) &&\n'> 
          <'\ttest "$refname" = "$sha1"\n'>
        )
      }
    )
    (command.ShFunction
      name: valid_ref_normalized
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:prereq)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [942]
                )
              ]
            )
            (command.Case
              to_match: {($ Id.VSub_Number '$1')}
              arms: [
                (case_arm
                  pat_list: [
                    {<Id.Lit_LBracket '['> <A-Z> <Id.KW_Bang '!'> <Id.Lit_RBracket ']'> 
                      <Id.Lit_Star '*'>
                    }
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:prereq)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_Number '$1')}
                          spids: [960]
                        )
                      ]
                    )
                    (C {<shift>})
                  ]
                  spids: [952 957 -1 967]
                )
              ]
            )
            (C {<test_expect_success>} {($ Id.VSub_DollarName '$prereq')} 
              {
                (DQ <'ref name \''> ($ Id.VSub_Number '$1') <'\' simplifies to \''> 
                  ($ Id.VSub_Number '$2') <'\''>
                )
              } 
              {
                (DQ <'\n'> <'\t\trefname='> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\$'>) 
                  <'(git check-ref-format --normalize \''> ($ Id.VSub_Number '$1') <'\') &&\n'> <'\t\ttest '> 
                  (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\$'>) <refname> 
                  (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <' = \''> ($ Id.VSub_Number '$2') <'\'\n'> <'\t'>
                )
              }
            )
          ]
        )
    )
    (command.ShFunction
      name: invalid_ref_normalized
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:prereq)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1009]
                )
              ]
            )
            (command.Case
              to_match: {($ Id.VSub_Number '$1')}
              arms: [
                (case_arm
                  pat_list: [
                    {<Id.Lit_LBracket '['> <A-Z> <Id.KW_Bang '!'> <Id.Lit_RBracket ']'> 
                      <Id.Lit_Star '*'>
                    }
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:prereq)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_Number '$1')}
                          spids: [1027]
                        )
                      ]
                    )
                    (C {<shift>})
                  ]
                  spids: [1019 1024 -1 1034]
                )
              ]
            )
            (C {<test_expect_success>} {($ Id.VSub_DollarName '$prereq')} 
              {(DQ <'check-ref-format --normalize rejects \''> ($ Id.VSub_Number '$1') <'\''>)} 
              {
                (DQ <'\n'> <'\t\ttest_must_fail git check-ref-format --normalize \''> 
                  ($ Id.VSub_Number '$1') <'\'\n'> <'\t'>
                )
              }
            )
          ]
        )
    )
    (C {<valid_ref_normalized>} {(SQ <'heads/foo'>)} {(SQ <'heads/foo'>)})
    (C {<valid_ref_normalized>} {(SQ <'refs///heads/foo'>)} {(SQ <'refs/heads/foo'>)})
    (C {<valid_ref_normalized>} {<Id.KW_Bang '!'> <MINGW>} {(SQ <'/heads/foo'>)} {(SQ <'heads/foo'>)})
    (C {<valid_ref_normalized>} {(SQ <'///heads/foo'>)} {(SQ <'heads/foo'>)})
    (C {<invalid_ref_normalized>} {(SQ <foo>)})
    (C {<invalid_ref_normalized>} {<Id.KW_Bang '!'> <MINGW>} {(SQ <'/foo'>)})
    (C {<invalid_ref_normalized>} {(SQ <'heads/foo/../bar'>)})
    (C {<invalid_ref_normalized>} {(SQ <'heads/./foo'>)})
    (C {<invalid_ref_normalized>} {(SQ <'heads\\foo'>)})
    (C {<invalid_ref_normalized>} {(SQ <'heads/foo.lock'>)})
    (C {<invalid_ref_normalized>} {(SQ <'heads///foo.lock'>)})
    (C {<invalid_ref_normalized>} {(SQ <'foo.lock/bar'>)})
    (C {<invalid_ref_normalized>} {(SQ <'foo.lock///bar'>)})
    (C {<test_done>})
  ]
)