#######################################################
#
# Test parsestringarray(), weird indices, change comment parsing
#
# The 4xx tests are all related, and 400-419 are the readstringarray tests,
# 420-439 the same for readstringarrayidx, 440-459 parsestringarray, and
# 460-479 parsestringarrayidx
#
#######################################################
body common control
{
  inputs => { "../../default.sub.cf" };
  bundlesequence => { default("$(this.promise_filename)") };
  version => "1.0";
}

bundle agent init
{
  files:
    "$(G.testfile)" delete => init_delete;

    "$(G.testfile)"
      create => "true",
      edit_line => init_fill_in;
}

bundle edit_line init_fill_in
{
  insert_lines:
    "0:1:2
1:2:3
here is:a line: with spaces : in it
blank:fields:::in here::
:leading blank field
this:is:a:test
# A duplicate follows: this line is not always a comment
this:also
last:one";
}

body delete init_delete
{
  dirlinks => "delete";
  rmdirs => "true";
}

#######################################################
bundle agent test
{
  vars:
    "teststr" string => readfile("$(G.testfile)", 1000);
    "cnt" int => parsestringarray("ary", "$(teststr)", "", ":", 10, 1000);
    "num" int => "8";
}

#######################################################
bundle agent check
{
  vars:
    "idx" slist => getindices("test.ary");

  classes:
    "ok"
      and => {
        strcmp("$(test.num)", "$(test.cnt)"),
        strcmp("$(test.ary[0][0])", "0"),
        strcmp("$(test.ary[0][1])", "1"),
        strcmp("$(test.ary[0][2])", "2"),
        strcmp("$(test.ary[1][0])", "1"),
        strcmp("$(test.ary[1][1])", "2"),
        strcmp("$(test.ary[1][2])", "3"),
        strcmp("$(test.ary[here is][0])", "here is"),
        strcmp("$(test.ary[here is][1])", "a line"),
        strcmp("$(test.ary[here is][2])", " with spaces "),
        strcmp("$(test.ary[here is][3])", " in it"),
        strcmp("$(test.ary[blank][0])", "blank"),
        strcmp("$(test.ary[blank][1])", "fields"),
        strcmp("$(test.ary[blank][2])", ""),
        strcmp("$(test.ary[blank][3])", ""),
        strcmp("$(test.ary[blank][4])", "in here"),
        strcmp("$(test.ary[blank][5])", ""),
        strcmp("$(test.ary[blank][6])", ""),
        strcmp("$(test.ary[][0])", ""),
        strcmp("$(test.ary[][1])", "leading blank field"),
        strcmp(
          "$(test.ary[# A duplicate follows][0])", "# A duplicate follows"
        ),
        strcmp(
          "$(test.ary[# A duplicate follows][1])",
          "this line is not always a comment"
        ),
        strcmp("$(test.ary[this][0])", "this"),
        strcmp("$(test.ary[this][1])", "also"),
        strcmp("$(test.ary[this][2])", "$(const.dollar)test.ary[this][2]"),
        strcmp("$(test.ary[this][3])", "$(const.dollar)test.ary[this][3]"),
        strcmp("$(test.ary[last][0])", "last"),
        strcmp("$(test.ary[last][1])", "one"),
      };

  reports:
    DEBUG::
      "expected $(test.num) entries, saw $(test.cnt)";
      "saw array indices '$(idx)'";
      "expected test.ary[0][0] = '0', saw '$(test.ary[0][0])'";
      "expected test.ary[0][1] = '1', saw '$(test.ary[0][1])'";
      "expected test.ary[0][2] = '2', saw '$(test.ary[0][2])'";
      "expected test.ary[1][0] = '1', saw '$(test.ary[1][0])'";
      "expected test.ary[1][1] = '2', saw '$(test.ary[1][1])'";
      "expected test.ary[1][2] = '3', saw '$(test.ary[1][2])'";
      "expected test.ary[here is][0] = 'here is', saw '$(test.ary[here is][0])'";
      "expected test.ary[here is][1] = 'a line', saw '$(test.ary[here is][1])'";
      "expected test.ary[here is][2] = ' with spaces ', saw '$(test.ary[here is][2])'";
      "expected test.ary[here is][3] = ' in it', saw '$(test.ary[here is][3])'";
      "expected test.ary[blank][0] = 'blank', saw '$(test.ary[blank][0])'";
      "expected test.ary[blank][1] = 'fields', saw '$(test.ary[blank][1])'";
      "expected test.ary[blank][2] = '', saw '$(test.ary[blank][2])'";
      "expected test.ary[blank][3] = '', saw '$(test.ary[blank][3])'";
      "expected test.ary[blank][4] = 'in here', saw '$(test.ary[blank][4])'";
      "expected test.ary[blank][5] = '', saw '$(test.ary[blank][5])'";
      "expected test.ary[blank][6] = '', saw '$(test.ary[blank][6])'";
      "expected test.ary[][0] = '', saw '$(test.ary[][0])'";
      "expected test.ary[][1] = 'leading blank field', saw '$(test.ary[][1])'";
      "expected test.ary[# A duplicate follows][0] = '# A duplicate follows', saw '$(test.ary[# A duplicate follows][0])'";
      "expected test.ary[# A duplicate follows][1] = 'this line is not always a comment', saw '$(test.ary[# A duplicate follows][1])'";
      "expected test.ary[this][0] = 'this', saw '$(test.ary[this][0])'";
      "expected test.ary[this][1] = 'also', saw '$(test.ary[this][1])'";
      "expected test.ary[this][2] = '$(const.dollar)test.ary[this][2]', saw '$(test.ary[this][2])'";
      "expected test.ary[this][3] = '$(const.dollar)test.ary[this][3]', saw '$(test.ary[this][3])'";
      "expected test.ary[last][0] = 'last', saw '$(test.ary[last][0])'";
      "expected test.ary[last][1] = 'one', saw '$(test.ary[last][1])'";

    ok::
      "$(this.promise_filename) Pass";

    !ok::
      "$(this.promise_filename) FAIL";
}
