(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:'credential-store tests' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(.)} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) (/lib-credential.sh)})
    (C {(helper_test)} {(store)})
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'when xdg file does not exist, xdg file not created'
            span_id: 29
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:33) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_path_is_missing "$HOME/.config/git/credentials" &&\n'
            span_id: 34
          ) (Token id:Id.Lit_Chars val:'\ttest -s "$HOME/.git-credentials"\n' span_id:35)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup xdg file' span_id:42))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:46) 
          (Token id:Id.Lit_Chars val:'\trm -f "$HOME/.git-credentials" &&\n' span_id:47) (Token id:Id.Lit_Chars val:'\tmkdir -p "$HOME/.config/git" &&\n' span_id:48) 
          (Token id:Id.Lit_Chars val:'\t>"$HOME/.config/git/credentials"\n' span_id:49)
        )
      }
    )
    (C {(helper_test)} {(store)})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'when xdg file exists, home file not created' span_id:61))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:65) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -s "$HOME/.config/git/credentials" &&\n'
            span_id: 66
          ) (Token id:Id.Lit_Chars val:'\ttest_path_is_missing "$HOME/.git-credentials"\n' span_id:67)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup custom xdg file' span_id:74))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:78) 
          (Token id:Id.Lit_Chars val:'\trm -f "$HOME/.git-credentials" &&\n' span_id:79) (Token id:Id.Lit_Chars val:'\trm -f "$HOME/.config/git/credentials" &&\n' span_id:80) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p "$HOME/xdg/git" &&\n' span_id:81) (Token id:Id.Lit_Chars val:'\t>"$HOME/xdg/git/credentials"\n' span_id:82)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:XDG_CONFIG_HOME)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$HOME') (/xdg))}
          spids: [86]
        )
      ]
    )
    (C {(export)} {(XDG_CONFIG_HOME)})
    (C {(helper_test)} {(store)})
    (C {(unset)} {(XDG_CONFIG_HOME)})
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'if custom xdg file exists, home and xdg files not created'
            span_id: 108
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:112) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "rm -f $HOME/xdg/git/credentials" &&\n'
            span_id: 113
          ) (Token id:Id.Lit_Chars val:'\ttest -s "$HOME/xdg/git/credentials" &&\n' span_id:114) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_path_is_missing "$HOME/.git-credentials" &&\n'
            span_id: 115
          ) (Token id:Id.Lit_Chars val:'\ttest_path_is_missing "$HOME/.config/git/credentials"\n' span_id:116)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'get: use home file if both home and xdg files have matches'
            span_id: 123
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:127) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "https://home-user:home-pass@example.com" >"$HOME/.git-credentials" &&\n'
            span_id: 128
          ) (Token id:Id.Lit_Chars val:'\tmkdir -p "$HOME/.config/git" &&\n' span_id:129) 
          (Token
            id: Id.Lit_Chars
            val: 
'\techo "https://xdg-user:xdg-pass@example.com" >"$HOME/.config/git/credentials" &&\n'
            span_id: 130
          ) (Token id:Id.Lit_Chars val:'\tcheck fill store <<-\\EOF\n' span_id:131) 
          (Token id:Id.Lit_Chars val:'\tprotocol=https\n' span_id:132) (Token id:Id.Lit_Chars val:'\thost=example.com\n' span_id:133) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:134) (Token id:Id.Lit_Chars val:'\tprotocol=https\n' span_id:135) 
          (Token id:Id.Lit_Chars val:'\thost=example.com\n' span_id:136) (Token id:Id.Lit_Chars val:'\tusername=home-user\n' span_id:137) 
          (Token id:Id.Lit_Chars val:'\tpassword=home-pass\n' span_id:138) (Token id:Id.Lit_Chars val:'\t--\n' span_id:139) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:140)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'get: use xdg file if home file has no matches' span_id:147))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:151) 
          (Token id:Id.Lit_Chars val:'\t>"$HOME/.git-credentials" &&\n' span_id:152) (Token id:Id.Lit_Chars val:'\tmkdir -p "$HOME/.config/git" &&\n' span_id:153) 
          (Token
            id: Id.Lit_Chars
            val: 
'\techo "https://xdg-user:xdg-pass@example.com" >"$HOME/.config/git/credentials" &&\n'
            span_id: 154
          ) (Token id:Id.Lit_Chars val:'\tcheck fill store <<-\\EOF\n' span_id:155) 
          (Token id:Id.Lit_Chars val:'\tprotocol=https\n' span_id:156) (Token id:Id.Lit_Chars val:'\thost=example.com\n' span_id:157) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:158) (Token id:Id.Lit_Chars val:'\tprotocol=https\n' span_id:159) 
          (Token id:Id.Lit_Chars val:'\thost=example.com\n' span_id:160) (Token id:Id.Lit_Chars val:'\tusername=xdg-user\n' span_id:161) 
          (Token id:Id.Lit_Chars val:'\tpassword=xdg-pass\n' span_id:162) (Token id:Id.Lit_Chars val:'\t--\n' span_id:163) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:164)
        )
      }
    )
    (C {(test_expect_success)} {(POSIXPERM) (Id.Lit_Comma ',') (SANITY)} 
      {(SQ (Token id:Id.Lit_Chars val:'get: use xdg file if home file is unreadable' span_id:175))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:179) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "https://home-user:home-pass@example.com" >"$HOME/.git-credentials" &&\n'
            span_id: 180
          ) (Token id:Id.Lit_Chars val:'\tchmod -r "$HOME/.git-credentials" &&\n' span_id:181) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p "$HOME/.config/git" &&\n' span_id:182) 
          (Token
            id: Id.Lit_Chars
            val: 
'\techo "https://xdg-user:xdg-pass@example.com" >"$HOME/.config/git/credentials" &&\n'
            span_id: 183
          ) (Token id:Id.Lit_Chars val:'\tcheck fill store <<-\\EOF\n' span_id:184) 
          (Token id:Id.Lit_Chars val:'\tprotocol=https\n' span_id:185) (Token id:Id.Lit_Chars val:'\thost=example.com\n' span_id:186) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:187) (Token id:Id.Lit_Chars val:'\tprotocol=https\n' span_id:188) 
          (Token id:Id.Lit_Chars val:'\thost=example.com\n' span_id:189) (Token id:Id.Lit_Chars val:'\tusername=xdg-user\n' span_id:190) 
          (Token id:Id.Lit_Chars val:'\tpassword=xdg-pass\n' span_id:191) (Token id:Id.Lit_Chars val:'\t--\n' span_id:192) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:193)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'store: if both xdg and home files exist, only store in home file'
            span_id: 200
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:204) 
          (Token id:Id.Lit_Chars val:'\t>"$HOME/.git-credentials" &&\n' span_id:205) (Token id:Id.Lit_Chars val:'\tmkdir -p "$HOME/.config/git" &&\n' span_id:206) 
          (Token id:Id.Lit_Chars val:'\t>"$HOME/.config/git/credentials" &&\n' span_id:207) (Token id:Id.Lit_Chars val:'\tcheck approve store <<-\\EOF &&\n' span_id:208) 
          (Token id:Id.Lit_Chars val:'\tprotocol=https\n' span_id:209) (Token id:Id.Lit_Chars val:'\thost=example.com\n' span_id:210) 
          (Token id:Id.Lit_Chars val:'\tusername=store-user\n' span_id:211) (Token id:Id.Lit_Chars val:'\tpassword=store-pass\n' span_id:212) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:213) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "https://store-user:store-pass@example.com" >expected &&\n'
            span_id: 214
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected "$HOME/.git-credentials" &&\n' span_id:215) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_be_empty "$HOME/.config/git/credentials"\n'
            span_id: 216
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'erase: erase matching credentials from both xdg and home files'
            span_id: 224
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:228) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "https://home-user:home-pass@example.com" >"$HOME/.git-credentials" &&\n'
            span_id: 229
          ) (Token id:Id.Lit_Chars val:'\tmkdir -p "$HOME/.config/git" &&\n' span_id:230) 
          (Token
            id: Id.Lit_Chars
            val: 
'\techo "https://xdg-user:xdg-pass@example.com" >"$HOME/.config/git/credentials" &&\n'
            span_id: 231
          ) (Token id:Id.Lit_Chars val:'\tcheck reject store <<-\\EOF &&\n' span_id:232) 
          (Token id:Id.Lit_Chars val:'\tprotocol=https\n' span_id:233) (Token id:Id.Lit_Chars val:'\thost=example.com\n' span_id:234) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:235) (Token id:Id.Lit_Chars val:'\ttest_must_be_empty "$HOME/.git-credentials" &&\n' span_id:236) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_be_empty "$HOME/.config/git/credentials"\n'
            span_id: 237
          )
        )
      }
    )
    (C {(test_done)})
  ]
)