extend("array")
extend("test")
extend("string")

describe("array:apply usage", () => {

  it("should call a function with array elements for sum", () => {
    res = array:apply((x,y) => x + y, [10, 20])
    expect_equal(res, 30)
  })

  it("should handle an empty array => call fn() with zero args", () => {
    res = array:apply(() => 9999, [])
    expect_equal(res, 9999)
  })

  it("should allow partial usage => known function, missing array", () => {
    myAdder = array:apply((a,b,c) => a*b*c)
    out = myAdder([2,3,4])
    expect_equal(out, 24)
  })

  it("should allow placeholder usage => known array, missing function", () => {
    arr = [5,7]
    partial = array:apply(_, arr)
    result = partial((a,b) => a - b)
    expect_equal(result, -2)
  })

  it("should handle multiple array elements => e.g. 3 elements => function called with (a,b,c)", () => {
    tripleProduct = array:apply((a,b,c) => a*b*c, [2,3,5])
    expect_equal(tripleProduct, 30)
  })

  it("should handle underscore placeholders => two placeholders => final usage", () => {
    partialBoth = array:apply() # returns partial => needs both
    partialWithFn = partialBoth((x,y)=>x+y)
    finalOut = partialWithFn([1,2])
    expect_equal(finalOut, 3)
  })

})

