class Slots {
  foreign static noSet
  foreign static getSlots(bool, num, string, bytes, value)
  foreign static setSlots(a, b, c, d, e)
  foreign static slotTypes(bool, foreignObj, list, nullObj, num, string, unknown)
  foreign static ensure()
  foreign static ensureOutsideForeign()
  foreign static getListCount(list)
  foreign static getListElement(list, index)
}

foreign class ForeignType {
  construct new() {}
}

// If nothing is set in the return slot, it retains its previous value, the
// receiver.
System.print(Slots.noSet == Slots) // expect: true

var value = ["value"]
System.print(Slots.getSlots(true, "by\0te", 1.5, "str", value) == value)
// expect: true

System.print(Slots.setSlots(value, 0, 0, 0, 0) == value)
// expect: true

System.print(Slots.slotTypes(false, ForeignType.new(), [], null, 1.2, "str", 1..2))
// expect: true

System.print(Slots.ensure())
// expect: 1 -> 20 (190)

System.print(Slots.ensureOutsideForeign())
// expect: 0 -> 20 (190)

var ducks = ["Huey", "Dewey", "Louie"]
System.print(Slots.getListCount(ducks))      // expect: 3
System.print(Slots.getListElement(ducks, 0)) // expect: Huey
System.print(Slots.getListElement(ducks, 1)) // expect: Dewey
