extend("test")
extend("array")
extend("std")
describe("array:key_eq + std:deep integration", () => {
it("builds a partial predicate and evaluates on single items", () => {
people = [
[name:"Abby", age:7, hair:"blond"],
[name:"Fred", age:12, hair:"brown"],
[name:"Rusty", age:30, hair:"brown"],
[name:"Alois", age:65, disposition:"surly"]
]
hasBrownHair = array:key_eq("brown", "hair")
expect_equal(hasBrownHair(people[1]), true)
expect_equal(hasBrownHair(people[0]), false)
expect_equal(hasBrownHair(people[3]), false)
})
it("supports full application with value, key, and object", () => {
people = [
[name:"Abby", age:7, hair:"blond"],
[name:"Fred", age:12, hair:"brown"],
[name:"Rusty", age:30, hair:"brown"],
[name:"Alois", age:65, disposition:"surly"]
]
expect_equal(array:key_eq("brown", "hair", people[2]), true)
expect_equal(array:key_eq("blond", "hair", people[2]), false)
})
it("supports placeholder completion for the value first", () => {
people = [
[name:"Abby", age:7, hair:"blond"],
[name:"Fred", age:12, hair:"brown"],
[name:"Rusty", age:30, hair:"brown"],
[name:"Alois", age:65, disposition:"surly"]
]
eqHair = array:key_eq(_, "hair")
expect_equal(eqHair("brown", people[2]), true)
expect_equal(eqHair("blond", people[2]), false)
})
it("filters a mixed array of keyed objects and deep-prints", () => {
people = [
[name:"Abby", age:7, hair:"blond"],
[name:"Fred", age:12, hair:"brown"],
[name:"Rusty", age:30, hair:"brown"],
[name:"Alois", age:65, disposition:"surly"]
]
hasBrownHair = array:key_eq("brown", "hair")
result = std:deep(array:filter(hasBrownHair, people))
expect_equal(
result,
[
[name:"Fred", age:12, hair:"brown"],
[name:"Rusty", age:30, hair:"brown"]
]
)
})
it("works with array:find and array:findIndex", () => {
people = [
[name:"Abby", age:7, hair:"blond"],
[name:"Fred", age:12, hair:"brown"],
[name:"Rusty", age:30, hair:"brown"],
[name:"Alois", age:65, disposition:"surly"]
]
hasBrownHair = array:key_eq("brown", "hair")
first = array:find(hasBrownHair, people)
expect_equal(first["name"], "Fred")
idx = array:findIndex(hasBrownHair, people)
expect_equal(idx, 1)
})
it("composes with other predicates", () => {
people = [
[name:"Abby", age:7, hair:"blond"],
[name:"Fred", age:12, hair:"brown"],
[name:"Rusty", age:30, hair:"brown"],
[name:"Alois", age:65, disposition:"surly"]
]
hasBrownHair = array:key_eq("brown", "hair")
isAdult = p => p["age"] >= 18
both = array:filter(p => hasBrownHair(p) && isAdult(p), people)
expect_equal(both, [[name:"Rusty", age:30, hair:"brown"]])
})
it("compares numeric values by key", () => {
people = [
[name:"Abby", age:7, hair:"blond"],
[name:"Fred", age:12, hair:"brown"],
[name:"Rusty", age:30, hair:"brown"]
]
isAge12 = array:key_eq(12, "age")
expect_equal(isAge12(people[1]), true)
expect_equal(isAge12(people[2]), false)
only12 = array:filter(isAge12, people)
expect_equal(only12, [[name:"Fred", age:12, hair:"brown"]])
})
it("treats missing keys as false", () => {
people = [
[name:"Abby", age:7, hair:"blond"],
[name:"Fred", age:12, hair:"brown"],
[name:"Rusty", age:30, hair:"brown"],
[name:"Alois", age:65, disposition:"surly"]
]
hasDispositionSurly = array:key_eq("surly", "disposition")
expect_equal(hasDispositionSurly(people[3]), true)
expect_equal(hasDispositionSurly(people[0]), false)
})
it("integrates with every and some", () => {
people = [
[name:"Abby", age:7, hair:"blond"],
[name:"Fred", age:12, hair:"brown"],
[name:"Rusty", age:30, hair:"brown"]
]
hasBrownHair = array:key_eq("brown", "hair")
expect_equal(array:every(p => p["age"] > 0, people), true)
expect_equal(array:some(hasBrownHair, people), true)
})
it("supports passing a key_eq partial into a filter partial", () => {
people = [
[name:"Abby", age:7, hair:"blond"],
[name:"Fred", age:12, hair:"brown"],
[name:"Rusty", age:30, hair:"brown"]
]
hasBrownHair = array:key_eq("brown", "hair")
filterBrownHair = array:filter(hasBrownHair)
expect_equal(
filterBrownHair(people),
[
[name:"Fred", age:12, hair:"brown"],
[name:"Rusty", age:30, hair:"brown"]
]
)
})
})