Namespaces:
  sys: io.murano.system

Name: TestEngineFunctions

Methods:
  testJoin:
    Body:
      - $arr: [xx, 123]
      - Return: (' '.join($arr))

  testSplit:
    Body:
      - Return: ('x yy 123').split(' ')

  testLen:
    Body:
      - $a: str
      - $b: [1, 2, 3, 4]
      - $c: {'a': 'xxx' }
      - Return: len($a) + len($b) + len($c)

  testCoalesce:
    Arguments:
      - arg1:
          Contract: $.string()
      - arg2:
          Contract: $.string()
      - arg3:
          Contract: $.string()
    Body:
      Return: coalesce($arg1, $arg2, $arg3)

  testBase64Encode:
    Arguments:
      - arg:
          Contract: $.string()
    Body:
      Return: base64encode($arg)

  testBase64Decode:
    Arguments:
      - arg:
          Contract: $.string()
    Body:
      Return: base64decode($arg)

  testFormat:
    Arguments:
      - format:
          Contract: $.string()
      - arg1:
          Contract: $.string()
      - arg2:
          Contract: $.string()
    Body:
      Return: $format.format($arg1, $arg2)

  testReplaceStr:
    Arguments:
      - what:
          Contract: $.string()
      - old:
          Contract: $.string()
      - new:
          Contract: $.string()
    Body:
      Return: $what.replace($old, $new)

  testReplaceDict:
    Arguments:
      - what:
          Contract: $.string()
      - with:
          Contract:
            $.string(): $.string()
    Body:
      Return: $what.replace($with)

  testToLower:
    Arguments:
      - arg:
          Contract: $.string()
    Body:
      Return: toLower($arg)

  testToUpper:
    Arguments:
      - arg:
          Contract: $.string()
    Body:
      Return: toUpper($arg)

  testStartsWith:
    Arguments:
      - what:
          Contract: $.string()
      - arg:
          Contract: $.string()
    Body:
      Return: $what.startsWith($arg)

  testEndsWith:
    Arguments:
      - what:
          Contract: $.string()
      - arg:
          Contract: $.string()
    Body:
      Return: $what.endsWith($arg)

  testTrim:
    Arguments:
      - arg:
          Contract: $.string()
    Body:
      Return: trim($arg)

  testSubstr:
    Arguments:
      - str:
          Contract: $.string()
      - arg1:
          Contract: $.int()
      - arg2:
          Contract: $.int()
    Body:
      Return: $str.substr(0, $arg1) +
              $str.substr($arg1, $arg2) +
              $str.substr($arg1 + $arg2)

  testStr:
    Arguments:
      - arg:
          Contract: $
    Body:
      Return: str($arg)

  testInt:
    Arguments:
      - arg:
          Contract: $.string()
    Body:
      Return: int($arg)

  testKeys:
    Arguments:
      - arg:
          Contract: {}
    Body:
      Return: $arg.keys()

  testValues:
    Arguments:
      - arg:
          Contract: {}
    Body:
      Return: $arg.values()

  testFlatten:
    Arguments:
      - arg:
          Contract: []
    Body:
      Return: $arg.flatten()

  testDictGet:
    Arguments:
      - dict:
          Contract:
            $.string(): $
      - key:
          Contract: $.string().notNull()
    Body:
      Return: $dict.get($key)

  testRandomName:
    Body:
      Return: randomName()

  testPSelect:
    Arguments:
      - arg:
          Contract: [$.int().notNull()]
    Body:
      Return: $arg.pselect($ * $)

  testBind:
    Arguments:
      - template:
          Contract: {}
      - args:
          Contract: {}
    Body:
      Return: $template.bind($args)

  testPatch:
    Body:
      - $patches:
          - op: add
            path: '/foo'
            value: bar
          - op: add
            path: '/baz'
            value: [1, 2, 3]
          - op: remove
            path: '/baz/1'
          - op: test
            path: '/baz'
            value: [1, 3]
          - op: replace
            path: '/baz/0'
            value: 42
          - op: remove
            path: '/baz/1'
      - $doc: {}
      - Return: $doc.patch($patches)

  testTake:
    Arguments:
      - list:
          Contract: [$.int()]
      - count:
          Contract: $.int()
    Body:
      - Return: $list.take($count)

  testSkip:
    Arguments:
      - list:
          Contract: [$.int()]
      - count:
          Contract: $.int()
    Body:
      - Return: $list.skip($count)

  testSkipTake:
    Arguments:
      - list:
          Contract: [$.int()]
      - start:
          Contract: $.int()
      - count:
          Contract: $.int()
    Body:
      - $l: $list.skip($start)
      - Return: $l.take($count)

  testSkipTakeChained:
    Arguments:
      - list:
          Contract: [$.int()]
      - start:
          Contract: $.int()
      - count:
          Contract: $.int()
    Body:
      - Return: $list.skip($start).take($count)


  testAggregate:
    Arguments:
      - list:
          Contract: [$.int()]
    Body:
      - Return: $list.aggregate($1 + $2)

  testAggregateWithInitializer:
    Arguments:
      - list:
          Contract: [$.int()]
      - initializer:
          Contract: $.int()
    Body:
      - Return: $list.aggregate($1 + $2, $initializer)

  testId:
    Body:
      Return: id($) + $.id()

  testType:
    Body:
      Return: type($) + $.type()

  testIsOperator:
    Body:
      - $logger: new(sys:Logger)
      - $.innerVariable: new(sys:Logger)
      - $derivedClassObject: new(DerivedFrom2Classes)
      - Return: $logger is sys:Logger
                and $ is 'TestEngineFunctions'
                and $.innerVariable is 'io.murano.system.Logger'
                and $derivedClassObject is ParentClass1
                and $derivedClassObject is ParentClass2

  testNegativeIsOperator:
    Arguments:
      - nullArg:
          Contract: $.class(sys:Logger)
          Default: null
    Body:
      - $nullVariable: null
      - Return: $nullVariable is sys:Logger
                or $nullArg is sys:Logger
