#######################################################
#
# Test makerule()
#
#######################################################
body common control
{
  inputs => { "../../default.sub.cf" };
  bundlesequence => { default("$(this.promise_filename)") };
  version => "1.0";
}

bundle agent init
{
  vars:
    "dummy" string => "dummy";
}

#######################################################
bundle agent test
{
  vars:
    "lold" slist => { "$(G.etc_passwd)", "$(G.etc_group)" };
    "lnew" slist => { "$(G.etc_passwd)", "$(G.testfile)" };
    "lnon" slist => { "$(G.etc_passwd)", "/etc/NoFriggin'WayThisExi5ts" };

  files:
    "$(G.testfile)" create => "true";
    "$(G.testfile).nosuchfile" delete => tidy;
}

#######################################################
bundle agent check
{
  classes:
    # A new file does not need to be rebuilt from an older file (fails)
    "ok1" expression => makerule("$(G.testfile)", "$(G.etc_passwd)");

    # An older file does need to be rebuilt from a newer file
    "ok2" expression => makerule("$(G.etc_passwd)", "$(G.testfile)");

    # An older file cannot be rebuilt from a non existent file (fails)
    "ok3" expression => makerule("$(G.etc_passwd)", "$(G.testfile).nosuchfile");

    # An non existent file does need to be rebuilt from a source file
    "ok4" expression => makerule("$(G.testfile).nosuchfile", "$(G.etc_passwd)");

    # A new file does not need to be rebuilt from an older file (fails)
    "ok5" expression => makerule("$(G.testfile)", "test.lold");

    # An old file does need to be rebuilt from an newer file in a list
    "ok6" expression => makerule("$(G.etc_passwd)", "test.lnew");

    # An old file does not need to be rebuilt from sources with a missing file (fails)
    "ok7" expression => makerule("$(G.etc_passwd)", "test.lnon");
    "ok" and => { "!ok1", "ok2", "!ok3", "ok4", "!ok5", "ok6", "!ok7" };

  reports:
    DEBUG.ok1::
      "1. pass";

    DEBUG.ok2::
      "2. pass";

    DEBUG.ok3::
      "3. pass";

    DEBUG.ok4::
      "4. pass";

    DEBUG.ok5::
      "5. pass";

    DEBUG.ok6::
      "6. pass";

    DEBUG.ok7::
      "7. pass";

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

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