The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
--- !!perl/hash:TestML::Function
namespace:
  TestML: !!perl/hash:TestML::Str
    value: '0.1.0'

statements:
- !!perl/hash:TestML::Assignment
  name: Plan
  expr: !!perl/hash:TestML::Num
    value: 21
- !!perl/hash:TestML::Assignment
  name: Label
  expr: !!perl/hash:TestML::Str
    value: Fruity Tests
- !!perl/hash:TestML::Statement
  expr: !!perl/hash:TestML::Function
    statements:
    - !!perl/hash:TestML::Assignment
      name: Label
      expr: !!perl/hash:TestML::Str
        value: Anonymous function never called
    - !!perl/hash:TestML::Statement
      expr: !!perl/hash:TestML::Call
        name: 'True'
      assert: !!perl/hash:TestML::Assertion
        name: EQ
        expr: !!perl/hash:TestML::Call
          name: 'False'
- !!perl/hash:TestML::Assignment
  name: test1
  expr: !!perl/hash:TestML::Function
    signature:
    - f
    - c
    - t
    statements:
    - !!perl/hash:TestML::Statement
      expr: !!perl/hash:TestML::Expression
        calls:
        - !!perl/hash:TestML::Call
          name: List
          args:
          - !!perl/hash:TestML::Call
            name: f
          - !!perl/hash:TestML::Str
            value: ->
          - !!perl/hash:TestML::Call
            name: c
        - !!perl/hash:TestML::Call
          name: Join
      assert: !!perl/hash:TestML::Assertion
        name: EQ
        expr: !!perl/hash:TestML::Call
          name: t
    - !!perl/hash:TestML::Statement
      expr: !!perl/hash:TestML::Expression
        calls:
        - !!perl/hash:TestML::Call
          name: t
        - !!perl/hash:TestML::Call
          name: Strip
          args:
          - !!perl/hash:TestML::Call
            name: f
        - !!perl/hash:TestML::Call
          name: Strip
          args:
          - !!perl/hash:TestML::Str
            value: ->
      assert: !!perl/hash:TestML::Assertion
        name: EQ
        expr: !!perl/hash:TestML::Call
          name: c
    - !!perl/hash:TestML::Statement
      expr: !!perl/hash:TestML::Expression
        calls:
        - !!perl/hash:TestML::Call
          name: t
        - !!perl/hash:TestML::Call
          name: Strip
          args:
          - !!perl/hash:TestML::Str
            value: ->
      assert: !!perl/hash:TestML::Assertion
        name: EQ
        expr: !!perl/hash:TestML::Expression
          calls:
          - !!perl/hash:TestML::Call
            args:
            - !!perl/hash:TestML::Call
              name: f
            - !!perl/hash:TestML::Call
              name: c
            name: List
          - !!perl/hash:TestML::Call
            name: Join
- !!perl/hash:TestML::Statement
  expr: !!perl/hash:TestML::Expression
    calls:
    - !!perl/hash:TestML::Call
      name: test1
    - !!perl/hash:TestML::Call
      name: Type
  assert: !!perl/hash:TestML::Assertion
    name: EQ
    expr: !!perl/hash:TestML::Str
      value: Func
- !!perl/hash:TestML::Assignment
  name: Label
  expr: !!perl/hash:TestML::Str
    value: $BlockLabel
- !!perl/hash:TestML::Statement
  expr: !!perl/hash:TestML::Call
    name: test1
    args:
    - !!perl/hash:TestML::Point
      name: fruit
    - !!perl/hash:TestML::Point
      name: color
    - !!perl/hash:TestML::Point
      name: thing
  points:
  - fruit
  - color
  - thing
- !!perl/hash:TestML::Assignment
  name: test2
  expr: !!perl/hash:TestML::Function
    signature:
    - color
    - thing
    statements:
    - !!perl/hash:TestML::Statement
      expr: !!perl/hash:TestML::Call
        name: thing
      assert: !!perl/hash:TestML::Assertion
          name: HAS
          expr: !!perl/hash:TestML::Call
            name: color
- !!perl/hash:TestML::Statement
  expr: !!perl/hash:TestML::Call
    name: test2
    args:
    - !!perl/hash:TestML::Point
      name: color
    - !!perl/hash:TestML::Point
      name: thing
  points:
  - color
  - thing
- !!perl/hash:TestML::Assignment
  name: test3
  expr: !!perl/hash:TestML::Function
    signature:
    - a
    - b
    - c
    statements:
    - !!perl/hash:TestML::Statement
      expr: !!perl/hash:TestML::Call
          name: f1
          args:
          - !!perl/hash:TestML::Call
            name: a
      assert: !!perl/hash:TestML::Assertion
        name: EQ
        expr: !!perl/hash:TestML::Call
          name: b
    - !!perl/hash:TestML::Statement
      expr: !!perl/hash:TestML::Call
        name: f2
        args:
        - !!perl/hash:TestML::Call
          name: a
      assert: !!perl/hash:TestML::Assertion
        name: EQ
        expr: !!perl/hash:TestML::Call
          name: c
- !!perl/hash:TestML::Statement
  expr: !!perl/hash:TestML::Call
    name: test3
    args:
    - !!perl/hash:TestML::Point
      name: input
    - !!perl/hash:TestML::Point
      name: output1
    - !!perl/hash:TestML::Point
      name: output2
  points:
  - input
  - output1
  - output2
- !!perl/hash:TestML::Assignment
  name: Label
  expr: !!perl/hash:TestML::Str
    value: Passing functions as objects
- !!perl/hash:TestML::Assignment
  name: test4
  expr: !!perl/hash:TestML::Function
    signature:
    - func
    - num
    statements:
    - !!perl/hash:TestML::Statement
      expr: !!perl/hash:TestML::Expression
        calls:
        - !!perl/hash:TestML::Call
          name: func
        - !!perl/hash:TestML::Call
          name: Type
      assert: !!perl/hash:TestML::Assertion
        name: EQ
        expr: !!perl/hash:TestML::Str
          value: Func
    - !!perl/hash:TestML::Statement
      expr: !!perl/hash:TestML::Call
        name: func
        args:
        - !!perl/hash:TestML::Call
          name: num
- !!perl/hash:TestML::Assignment
  name: test5
  expr: !!perl/hash:TestML::Function
    signature:
    - num
    statements:
    - !!perl/hash:TestML::Statement
      expr: !!perl/hash:TestML::Call
        name: num
      assert: !!perl/hash:TestML::Assertion
        name: EQ
        expr: !!perl/hash:TestML::Num
          value: 42
- !!perl/hash:TestML::Statement
  expr: !!perl/hash:TestML::Call
      name: test4
      args:
      - !!perl/hash:TestML::Call
          name: test5
      - !!perl/hash:TestML::Num
        value: 42

data:
- !!perl/hash:TestML::Block
  label: Red Apple
  points:
    fruit: apple
    color: red
    thing: apple->red
- !!perl/hash:TestML::Block
  label: Orange Orange
  points:
    fruit: orange
    color: orange
    thing: orange->orange
- !!perl/hash:TestML::Block
  label: Green Grape
  points:
    fruit: grape
    color: green
    thing: grape->green
- !!perl/hash:TestML::Block
  label: One
  points:
    input: '1'
    output1: '43'
    output2: '2'
- !!perl/hash:TestML::Block
  label: Two
  points:
    input: '2'
    output1: '86'
    output2: '6'
- !!perl/hash:TestML::Block
  label: Three
  points:
    input: '5'
    output1: '215'
    output2: '30'