# file      : tests/manifest/task.testscript
# copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
# license   : MIT; see accompanying LICENSE file

test.options += -t

: valid
:
: Roundtrip the task manifest.
:
{
  : all-names
  :
  $* <<EOF >>EOF
  : 1
  name: libfoo
  version: 1.0
  repository-url: http://pkg.example.org/1/math
  trust: AB:0D:3F:C1:B0:13:E4:0E:AD:4A:08:06:AE:F3:85:DB:E2:27:5F:83:11:47:A2:7\
  8:64:3C:73:60:F8:66:3A:A4
  machine: windows_10-msvc_14
  target: x86_64-microsoft-win32-msvc14.0
  config: config.cc.coptions=/Z7 config.cc.loptions=/DEBUG
  warning-regex: '^warning: ' '^.+: warning: '
  EOF

  : no-config-no-regex
  :
  $* <<EOF >>EOF
  : 1
  name: libfoo
  version: 1.0
  repository-url: http://pkg.example.org/1/math
  machine: windows_10-msvc_14
  target: x86_64-microsoft-win32-msvc14.0
  EOF

  : typed-url
  :
  $* <<EOF >>EOF
  : 1
  name: libfoo
  version: 1.0
  repository-url: git+http://example.org/math
  machine: windows_10-msvc_14
  target: x86_64-microsoft-win32-msvc14.0
  EOF

  : repo-type
  :
  $* <<EOI >>EOO
  : 1
  name: libfoo
  version: 1.0
  repository-url: http://git.example.org/math
  repository-type: git
  machine: windows_10-msvc_14
  target: x86_64-microsoft-win32-msvc14.0
  EOI
  : 1
  name: libfoo
  version: 1.0
  repository-url: git+http://git.example.org/math
  machine: windows_10-msvc_14
  target: x86_64-microsoft-win32-msvc14.0
  EOO

  : config
  :
  {
    : empty-var-value
    :
    $* <<EOF >>EOF
    : 1
    name: libfoo
    version: 1.0
    repository-url: http://pkg.example.org/1/math
    machine: windows
    target: x86_64-microsoft-win32-msvc14.0
    config: abc=
    EOF

    : var-value-quoting
    :
    $* <<EOF >>EOF
    : 1
    name: libfoo
    version: 1.0
    repository-url: http://pkg.example.org/1/math
    machine: windows
    target: x86_64-microsoft-win32-msvc14.0
    config: abc='a "b '"d\e x y="
    EOF
  }

  : trust-yes
  :
  $* <<EOF >>EOF
  : 1
  name: libfoo
  version: 1.0
  repository-url: http://pkg.example.org/1/math
  trust: yes
  machine: windows_10-msvc_14
  target: x86_64-microsoft-win32-msvc14.0
  config: config.cc.coptions=/Z7 config.cc.loptions=/DEBUG
  EOF
}

: redefinition
:
{
  : name
  :
  $* <<EOI 2>'stdin:3:1: error: task package name redefinition' == 1
  : 1
  name: libfoo
  name: libfoo
  EOI

  : version
  :
  $* <<EOI 2>'stdin:3:1: error: task package version redefinition' == 1
  : 1
  version: 1.0
  version: 1.0
  EOI

  : repository
  :
  $* <<EOI 2>'stdin:3:1: error: task repository URL redefinition' == 1
  : 1
  repository-url: http://pkg.example.org/1/math
  repository-url: http://pkg.example.org/1/math
  EOI

  : machine
  :
  $* <<EOI 2>'stdin:3:1: error: task machine redefinition' == 1
  : 1
  machine: windows_10-msvc_14
  machine: windows_10-msvc_14
  EOI

  : target
  :
  $* <<EOI 2>'stdin:3:1: error: task target redefinition' == 1
  : 1
  target: x86_64-microsoft-win32-msvc14.0
  target: x86_64-microsoft-win32-msvc14.0
  EOI

  : config
  :
  $* <<EOI 2>'stdin:3:1: error: task configuration redefinition' == 1
  : 1
  config: config.cc.coptions=/Z7
  config: config.cc.loptions=/DEBUG
  EOI

  : warning-regex
  :
  $* <<EOI 2>'stdin:3:1: error: task warning regex redefinition' == 1
  : 1
  warning-regex: '^warning: '
  warning-regex: '^.+: warning: '
  EOI
}

: invalid
:
{
  : name-empty
  :
  $* <<EOI 2>'stdin:2:6: error: invalid task package name: length is less than two characters' == 1
  : 1
  name:
  EOI

  : version
  :
  {
    : empty
    :
    $* <<EOI 2>'stdin:2:9: error: invalid task package version: unexpected end' == 1
    : 1
    version:
    EOI

    : release
    :
    $* <<EOI 2>'stdin:2:10: error: invalid task package version release' == 1
    : 1
    version: 1.2.3-
    EOI
  }

  : repository
  :
  {
    : url
    :
    $* <<EOI 2>>EOE == 1
    : 1
    name: libfoo
    version: 1.0
    repository-url: http://pkg.example.org/math
    repository-type: pkg
    machine: windows_10-msvc_14
    target: x86_64-microsoft-win32-msvc14.0
    EOI
    stdin:4:17: error: invalid task repository URL: missing repository version
    EOE

    : type
    :
    $* <<EOI 2>>EOE == 1
    : 1
    repository-type: svn
    EOI
    stdin:2:18: error: invalid task repository type 'svn'
    EOE
  }

  : machine-empty
  :
  $* <<EOI 2>'stdin:2:9: error: empty task machine' == 1
  : 1
  machine:
  EOI

  : target-empty
  :
  $* <<EOI 2>'stdin:2:8: error: invalid task target: missing cpu' == 1
  : 1
  target:
  EOI

  : config
  :
  {
    : empty
    :
    $* <<EOI 2>'stdin:2:8: error: empty task configuration' == 1
    : 1
    config:
    EOI

    : bad-field
    :
    $* <<EOI 2>'stdin:2:15: error: invalid task configuration: unterminated quoted string' == 1
    : 1
    config: 'abc=x
    EOI

    : multiline
    :
    {
      : bad-field
      :
      $* <<EOI 2>'stdin:3:7: error: invalid task configuration: unterminated quoted string' == 1
      : 1
      config: \
      'abc=x
      \
      EOI
    }
  }

  : warning-regex
  :
  {
    : empty
    :
    $* <<EOI 2>'stdin:2:15: error: empty task warning regex' == 1
    : 1
    warning-regex:
    EOI

    : regex-error
    :
    $* <<EOI 2>>~/EOE/ == 1
    : 1
    warning-regex: '^[warning: '
    EOI
    /stdin:2:16: error: invalid task warning regex: invalid regex.*/
    EOE
  }

  : trust
  :
  $* <<EOI 2>'stdin:2:8: error: invalid repository certificate fingerprint' == 1
  : 1
  trust: abc
  EOI
}

: unknown-name
:
$* <<EOI 2>"stdin:2:1: error: unknown name 'x' in task manifest" == 1
: 1
x:
EOI

: missed
:
{
  : name
  :
  $* <<EOI 2>'stdin:6:1: error: no task package name specified' == 1
  : 1
  version: 1.0
  repository-url: http://pkg.example.org/1/math
  repository-type: pkg
  machine: windows_10-msvc_14
  EOI

  : version
  :
  $* <<EOI 2>'stdin:6:1: error: no task package version specified' == 1
  : 1
  name: libfoo
  repository-url: http://pkg.example.org/1/math
  repository-type: pkg
  machine: windows_10-msvc_14
  EOI

  : repository-url
  :
  $* <<EOI 2>'stdin:6:1: error: no task repository URL specified' == 1
  : 1
  name: libfoo
  version: 1.0
  machine: windows_10-msvc_14
  repository-type: git
  EOI

  : repository-type
  :
  $* <<EOI 2>'stdin:4:17: error: invalid task repository URL: missing repository version' == 1
  : 1
  name: libfoo
  version: 1.0
  repository-url: http://git.example.org/math
  machine: windows_10-msvc_14
  target: x86_64-microsoft-win32-msvc14.0
  EOI

  : machine
  :
  $* <<EOI 2>'stdin:6:1: error: no task machine specified' == 1
  : 1
  name: libfoo
  version: 1.0
  repository-url: http://pkg.example.org/1/math
  repository-type: pkg
  EOI

  : target
  :
  $* <<EOI 2>'stdin:7:1: error: no task target specified' == 1
  : 1
  name: libfoo
  version: 1.0
  repository-url: http://pkg.example.org/1/math
  repository-type: pkg
  machine: windows_10-msvc_14
  EOI
}