Skip to content

Commit

Permalink
fixing MoeArrayObject/ArrayClass to use slurpy params - and correctin…
Browse files Browse the repository at this point in the history
…g the test accordingly
  • Loading branch information
Stevan Little committed Mar 28, 2013
1 parent df8f336 commit f5bebc3
Show file tree
Hide file tree
Showing 3 changed files with 131 additions and 33 deletions.
111 changes: 99 additions & 12 deletions src/main/scala/org/moe/runtime/builtins/ArrayClass.scala
@@ -1,6 +1,7 @@
package org.moe.runtime.builtins

import org.moe.runtime._
import org.moe.runtime.nativeobjects._

/**
* setup class Array
Expand Down Expand Up @@ -44,38 +45,124 @@ object ArrayClass {
)
)

arrayClass.addMethod(
new MoeMethod(
"at_pos",
new MoeSignature(List(new MoeNamedParameter("$i"))),
env,
(e) => e.getCurrentInvocant.get.asInstanceOf[MoeArrayObject].at_pos(r, e.get("$i").get.asInstanceOf[MoeIntObject])
)
)

arrayClass.addMethod(
new MoeMethod(
"bind_pos",
new MoeSignature(List(new MoeNamedParameter("$i"), new MoeNamedParameter("$v"))),
env,
(e) => e.getCurrentInvocant.get.asInstanceOf[MoeArrayObject].bind_pos(
r,
e.get("$i").get.asInstanceOf[MoeIntObject],
e.get("$v").get
)
)
)

arrayClass.addMethod(
new MoeMethod(
"length",
new MoeSignature(),
env,
(e) => e.getCurrentInvocant.get.asInstanceOf[MoeArrayObject].length(r)
)
)

arrayClass.addMethod(
new MoeMethod(
"clear",
new MoeSignature(),
env,
(e) => e.getCurrentInvocant.get.asInstanceOf[MoeArrayObject].clear(r)
)
)

arrayClass.addMethod(
new MoeMethod(
"shift",
new MoeSignature(),
env,
(e) => e.getCurrentInvocant.get.unboxToArrayBuffer.get(0)
(e) => e.getCurrentInvocant.get.asInstanceOf[MoeArrayObject].shift(r)
)
)

arrayClass.addMethod(
new MoeMethod(
"pop",
new MoeSignature(),
env,
(e) => e.getCurrentInvocant.get.asInstanceOf[MoeArrayObject].pop(r)
)
)

arrayClass.addMethod(
new MoeMethod(
"unshift",
new MoeSignature(List(new MoeSlurpyParameter("@items"))),
env,
(e) => e.getCurrentInvocant.get.asInstanceOf[MoeArrayObject].unshift(r, e.get("@items").get.asInstanceOf[MoeArrayObject])
)
)

arrayClass.addMethod(
new MoeMethod(
"push",
new MoeSignature(List(new MoeSlurpyParameter("@items"))),
env,
(e) => e.getCurrentInvocant.get.asInstanceOf[MoeArrayObject].push(r, e.get("@items").get.asInstanceOf[MoeArrayObject])
)
)

arrayClass.addMethod(
new MoeMethod(
"slice",
new MoeSignature(List(new MoeSlurpyParameter("@items"))),
env,
(e) => e.getCurrentInvocant.get.asInstanceOf[MoeArrayObject].slice(r, e.get("@items").get.asInstanceOf[MoeArrayObject])
)
)

arrayClass.addMethod(
new MoeMethod(
"reverse",
new MoeSignature(),
env,
(e) => e.getCurrentInvocant.get.asInstanceOf[MoeArrayObject].reverse(r)
)
)

arrayClass.addMethod(
new MoeMethod(
"join",
new MoeSignature(List(new MoeOptionalParameter("$sep"))),
env,
(e) => e.get("$sep") match {
case Some(sep) => e.getCurrentInvocant.get.asInstanceOf[MoeArrayObject].join(r, sep.asInstanceOf[MoeStrObject])
case None => e.getCurrentInvocant.get.asInstanceOf[MoeArrayObject].join(r)
}
)
)

/**
* List of Methods to support:
* - values
* - reverse
* - at_pos ($index)
* - bind_pos ($index, $value)
* - slice (@indicies)
* - clear
* - exists ($value)
* - delete ($index | @indicies)
* - push ($item | @items)
* - pop
* - unshift ($item | @items)
* - sort ($sorter)
* - grep ($filter)
* - map ($callback) << returns values
* - each ($callback) << doesn't return values
* - first ($predicate)
* - join (?$seperator)
* - min ($comparator)
* - max ($comparator)
* - sum
* - length
*
* See the following for details:
* - https://metacpan.org/release/autobox-Core
Expand Down
29 changes: 21 additions & 8 deletions src/main/scala/org/moe/runtime/nativeobjects/MoeArrayObject.scala
Expand Up @@ -29,9 +29,19 @@ class MoeArrayObject(
else array(i.unboxToInt.get)
}

def bind_pos (r: MoeRuntime, i: MoeIntObject, v: MoeObject): MoeObject = {
val idx = i.unboxToInt.get
if (idx >= array.length) setNativeValue(array.padTo(idx, r.NativeObjects.getUndef))
array.insert(idx, v)
v
}

def length (r: MoeRuntime): MoeIntObject = r.NativeObjects.getInt(array.length)

def clear (r: MoeRuntime) = array.clear
def clear (r: MoeRuntime): MoeObject = {
array.clear()
r.NativeObjects.getUndef
}

def shift (r: MoeRuntime): MoeObject =
if(array.length == 0) r.NativeObjects.getUndef
Expand All @@ -41,23 +51,26 @@ class MoeArrayObject(
if(array.length == 0) r.NativeObjects.getUndef
else array.remove(array.length - 1)

def unshift (r: MoeRuntime, values: MoeObject*): MoeIntObject = {
array.insertAll(0, values)
def unshift (r: MoeRuntime, values: MoeArrayObject): MoeIntObject = {
array.insertAll(0, values.unboxToArrayBuffer.get)
r.NativeObjects.getInt(array.length)
}

def push (r: MoeRuntime, values: MoeObject*): MoeIntObject = {
array ++= values
def push (r: MoeRuntime, values: MoeArrayObject): MoeIntObject = {
array ++= values.unboxToArrayBuffer.get
r.NativeObjects.getInt(array.length)
}

def slice(r: MoeRuntime, indicies: MoeIntObject*): MoeArrayObject = r.NativeObjects.getArray(
indicies.map(i => at_pos(r, i)) : _*
def slice(r: MoeRuntime, indicies: MoeArrayObject): MoeArrayObject = r.NativeObjects.getArray(
indicies.unboxToArrayBuffer.get.map(i => at_pos(r, i.asInstanceOf[MoeIntObject])) : _*
)

def reverse(r: MoeRuntime): MoeArrayObject = r.NativeObjects.getArray(array.reverse:_*)

def join(r: MoeRuntime, sep: String): String = array.map(_.toString).mkString(sep)
def join(r: MoeRuntime): MoeStrObject = r.NativeObjects.getStr(array.map(_.toString).mkString(""))
def join(r: MoeRuntime, sep: MoeStrObject): MoeStrObject = r.NativeObjects.getStr(
array.map(_.toString).mkString(sep.unboxToString.get)
)

// MoeObject overrides

Expand Down
Expand Up @@ -108,33 +108,31 @@ class MoeArrayObjectTestSuite extends FunSuite with BeforeAndAfter {

test("... Array object push") {
val o = r.NativeObjects.getArray()
assert(0 == o.push(r).unboxToInt.get, "push no items onto empty array")
assert(0 == o.length(r).unboxToInt.get, "Array is empty (" + o.length(r) + ")")

assert(1 == o.push(r, r.NativeObjects.getInt(2)).unboxToInt.get, "push single item onto empty array")
assert(1 == o.push(r, r.NativeObjects.getArray(r.NativeObjects.getInt(2))).unboxToInt.get, "push single item onto empty array")

val array = o.getNativeValue
assert(array(0).unboxToInt.get === 2)

assert(2 == o.push(r, r.NativeObjects.getInt(4)).unboxToInt.get, "push single item onto single-item array")
assert(2 == o.push(r, r.NativeObjects.getArray(r.NativeObjects.getInt(4))).unboxToInt.get, "push single item onto single-item array")

assert(4 == o.push(r, r.NativeObjects.getInt(6), r.NativeObjects.getInt(8)).unboxToInt.get, "push two items onto array")
assert(4 == o.push(r, r.NativeObjects.getArray(r.NativeObjects.getInt(6), r.NativeObjects.getInt(8))).unboxToInt.get, "push two items onto array")
assert(array(array.length - 1).unboxToInt.get === 8)
}

test("... Array object unshift") {
val o = r.NativeObjects.getArray()
assert(0 == o.unshift(r).unboxToInt.get, "unshift no items onto empty array")
assert(0 == o.length(r).unboxToInt.get, "Array is empty (" + o.length(r) + ")")

assert(1 == o.unshift(r, r.NativeObjects.getInt(2)).unboxToInt.get, "unshift single item onto empty array")
assert(1 == o.unshift(r, r.NativeObjects.getArray(r.NativeObjects.getInt(2))).unboxToInt.get, "unshift single item onto empty array")

val array = o.getNativeValue
assert(array(0).unboxToInt.get === 2)

assert(2 == o.unshift(r, r.NativeObjects.getInt(4)).unboxToInt.get, "unshift single item onto single-item array")
assert(2 == o.unshift(r, r.NativeObjects.getArray(r.NativeObjects.getInt(4))).unboxToInt.get, "unshift single item onto single-item array")

assert(4 == o.unshift(r, r.NativeObjects.getInt(6), r.NativeObjects.getInt(8)).unboxToInt.get, "unshift two items onto array")
assert(4 == o.unshift(r, r.NativeObjects.getArray(r.NativeObjects.getInt(6), r.NativeObjects.getInt(8))).unboxToInt.get, "unshift two items onto array")
assert(array(0).unboxToInt.get === 6)
assert(array(array.length - 1).unboxToInt.get === 2)
}
Expand All @@ -145,15 +143,15 @@ class MoeArrayObjectTestSuite extends FunSuite with BeforeAndAfter {
r.NativeObjects.getInt(2),
r.NativeObjects.getInt(3)
)
var slice = o.slice(r, r.NativeObjects.getInt(1))
var slice = o.slice(r, r.NativeObjects.getArray(r.NativeObjects.getInt(1)))
assert(1 == slice.getNativeValue.length, "single item slice length")
assert(2 == slice.at_pos(r,r.NativeObjects.getInt(0)).unboxToInt.get, "result of single item slice")

slice = o.slice(r, r.NativeObjects.getInt(1), r.NativeObjects.getInt(0))
slice = o.slice(r, r.NativeObjects.getArray(r.NativeObjects.getInt(1), r.NativeObjects.getInt(0)))
assert(2 == slice.getNativeValue.length, "two-item slice length")
assert(1 == slice.at_pos(r,r.NativeObjects.getInt(1)).unboxToInt.get, "second item of two-item slice")

slice = o.slice(r, r.NativeObjects.getInt(3), r.NativeObjects.getInt(2), r.NativeObjects.getInt(4))
slice = o.slice(r, r.NativeObjects.getArray(r.NativeObjects.getInt(3), r.NativeObjects.getInt(2), r.NativeObjects.getInt(4)))
assert(3 == slice.getNativeValue.length, "non-existent item slice length")
assert(slice.at_pos(r,r.NativeObjects.getInt(0)).isUndef, "non-existent item in slice is undef")
assert(3 == slice.at_pos(r,r.NativeObjects.getInt(1)).unboxToInt.get)
Expand All @@ -178,7 +176,7 @@ class MoeArrayObjectTestSuite extends FunSuite with BeforeAndAfter {
r.NativeObjects.getInt(2),
r.NativeObjects.getInt(3)
)
assert(o.join(r, "|") == "1|2|3");
assert(o.join(r, "") == "123");
assert(o.join(r, r.NativeObjects.getStr("|")).unboxToString.get == "1|2|3");
assert(o.join(r).unboxToString.get == "123");
}
}

0 comments on commit f5bebc3

Please sign in to comment.