use super::*;

#[test]
fn success() {
  Test::new()
    .justfile(
      "
        export FOO := 'a'
        baz := 'c'
        export BAR := 'b'
        export ABC := FOO + BAR + baz

        wut:
          echo $FOO $BAR $ABC
      ",
    )
    .stdout("a b abc\n")
    .stderr("echo $FOO $BAR $ABC\n")
    .success();
}

#[test]
fn parameter() {
  Test::new()
    .justfile(
      r#"
        wut $FOO='a' BAR='b':
          echo $FOO
          echo {{BAR}}
          if [ -n "${BAR+1}" ]; then echo defined; else echo undefined; fi
      "#,
    )
    .stdout("a\nb\nundefined\n")
    .stderr(
      "echo $FOO\necho b\nif [ -n \"${BAR+1}\" ]; then echo defined; else echo undefined; fi\n",
    )
    .success();
}

#[test]
fn parameter_not_visible_to_backtick() {
  Test::new()
    .arg("wut")
    .arg("bar")
    .justfile(
      r#"
        wut $FOO BAR=`if [ -n "${FOO+1}" ]; then echo defined; else echo undefined; fi`:
          echo $FOO
          echo {{BAR}}
      "#,
    )
    .stdout("bar\nundefined\n")
    .stderr("echo $FOO\necho undefined\n")
    .success();
}

#[test]
fn override_variable() {
  Test::new()
    .arg("--set")
    .arg("BAR")
    .arg("bye")
    .arg("FOO=hello")
    .justfile(
      "
        export FOO := 'a'
        baz := 'c'
        export BAR := 'b'
        export ABC := FOO + '-' + BAR + '-' + baz

        wut:
          echo $FOO $BAR $ABC
      ",
    )
    .stdout("hello bye hello-bye-c\n")
    .stderr("echo $FOO $BAR $ABC\n")
    .success();
}

#[test]
fn shebang() {
  Test::new()
    .justfile(
      "
        export FOO := 'a'
        baz := 'c'
        export BAR := 'b'
        export ABC := FOO + BAR + baz

        wut:
          #!/bin/sh
          echo $FOO $BAR $ABC
      ",
    )
    .stdout("a b abc\n")
    .success();
}

#[test]
fn recipe_backtick() {
  Test::new()
    .justfile(
      "
        export EXPORTED_VARIABLE := 'A-IS-A'

        recipe:
          echo {{`echo recipe $EXPORTED_VARIABLE`}}
      ",
    )
    .stdout("recipe A-IS-A\n")
    .stderr("echo recipe A-IS-A\n")
    .success();
}

#[test]
fn setting_implicit() {
  Test::new()
    .arg("foo")
    .arg("goodbye")
    .justfile(
      "
        set export

        A := 'hello'

        foo B C=`echo $A`:
          echo $A
          echo $B
          echo $C
      ",
    )
    .stdout("hello\ngoodbye\nhello\n")
    .stderr("echo $A\necho $B\necho $C\n")
    .success();
}

#[test]
fn setting_true() {
  Test::new()
    .justfile(
      "
        set export := true

        A := 'hello'

        foo B C=`echo $A`:
          echo $A
          echo $B
          echo $C
      ",
    )
    .arg("foo")
    .arg("goodbye")
    .stdout("hello\ngoodbye\nhello\n")
    .stderr("echo $A\necho $B\necho $C\n")
    .success();
}

#[test]
fn setting_false() {
  Test::new()
    .justfile(
      r#"
        set export := false

        A := 'hello'

        foo:
          if [ -n "${A+1}" ]; then echo defined; else echo undefined; fi
      "#,
    )
    .stdout("undefined\n")
    .stderr("if [ -n \"${A+1}\" ]; then echo defined; else echo undefined; fi\n")
    .success();
}

#[test]
fn setting_shebang() {
  Test::new()
    .arg("foo")
    .arg("goodbye")
    .justfile(
      "
        set export

        A := 'hello'

        foo B:
          #!/bin/sh
          echo $A
          echo $B
      ",
    )
    .stdout("hello\ngoodbye\n")
    .success();
}

#[test]
fn setting_override_undefined() {
  Test::new()
    .arg("A=zzz")
    .arg("foo")
    .justfile(
      r#"
        set export

        A := 'hello'
        B := `if [ -n "${A+1}" ]; then echo defined; else echo undefined; fi`

        foo C='goodbye' D=`if [ -n "${C+1}" ]; then echo defined; else echo undefined; fi`:
          echo $B
          echo $D
      "#,
    )
    .stdout("undefined\nundefined\n")
    .stderr("echo $B\necho $D\n")
    .success();
}

#[test]
fn setting_variable_not_visible() {
  Test::new()
    .arg("A=zzz")
    .justfile(
      r#"
        export A := 'hello'
        export B := `if [ -n "${A+1}" ]; then echo defined; else echo undefined; fi`

        foo:
          echo $B
      "#,
    )
    .stdout("undefined\n")
    .stderr("echo $B\n")
    .success();
}

#[test]
fn variables_exported_with_setting_are_visible_in_child() {
  Test::new()
    .write("foo.just", "bar:\n @echo $x")
    .justfile(
      "
        set export

        x := 'FOO'

        mod foo
      ",
    )
    .arg("foo::bar")
    .stdout("FOO\n")
    .success();
}
