Skip to content

Commit

Permalink
implemented string range enumeration using magicalStringIncrement fun…
Browse files Browse the repository at this point in the history
…ction and added more tests
  • Loading branch information
prakashk committed Feb 14, 2013
1 parent 785210b commit 56509b2
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 12 deletions.
21 changes: 10 additions & 11 deletions src/main/scala/org/moe/interpreter/Interpreter.scala
Expand Up @@ -209,18 +209,17 @@ object Interpreter {
val range_start = Utils.objToString(s)
val range_end = Utils.objToString(e)

// return the successor of the string ("abc" => "abd")
def succ(str: String) = str.init + (str.last.toInt + 1).toChar

// this is totally non-functional, imperative style code,
// not in Scala spirit; but will do, for now
var elems: List[String] = List()
var str = range_start
while (str <= range_end) {
elems = elems :+ str
str = succ(str)
if (range_start.length > range_end.length)
runtime.NativeObjects.getArray()
else {
var elems: List[String] = List()
var str = range_start
while (str <= range_end || str.length < range_end.length) {
elems = elems :+ str
str = Utils.magicalStringIncrement(str)
}
runtime.NativeObjects.getArray(elems.map(runtime.NativeObjects.getString(_)))
}
runtime.NativeObjects.getArray(elems.map(runtime.NativeObjects.getString(_)))
}
case _ => throw new MoeErrors.UnexpectedType("Pair of MoeIntObject or MoeStringObject expected")
}
Expand Down
62 changes: 61 additions & 1 deletion src/test/scala/org/moe/parser/RangeLiteralTestSuite.scala
Expand Up @@ -21,7 +21,40 @@ class RangeLiteralTestSuite extends FunSuite with BeforeAndAfter with ParserTest
assert(array(2).asInstanceOf[MoeIntObject].getNativeValue === 3)
}

test("... basic test with a simple string range") {
test("... basic test with a simple string range #1") {
val result = interpretCode(""" "1" .. "3" """)

val array: List[MoeObject] = result.asInstanceOf[MoeArrayObject].getNativeValue

assert(array.size === 3)
assert(array(0).asInstanceOf[MoeStringObject].getNativeValue === "1")
assert(array(1).asInstanceOf[MoeStringObject].getNativeValue === "2")
assert(array(2).asInstanceOf[MoeStringObject].getNativeValue === "3")
}

test("... basic test with a simple string range #2") {
val result = interpretCode(""" "01" .. "03" """)

val array: List[MoeObject] = result.asInstanceOf[MoeArrayObject].getNativeValue

assert(array.size === 3)
assert(array(0).asInstanceOf[MoeStringObject].getNativeValue === "01")
assert(array(1).asInstanceOf[MoeStringObject].getNativeValue === "02")
assert(array(2).asInstanceOf[MoeStringObject].getNativeValue === "03")
}

test("... basic test with a simple string range #3") {
val result = interpretCode(""" "1" .. "3" """)

val array: List[MoeObject] = result.asInstanceOf[MoeArrayObject].getNativeValue

assert(array.size === 3)
assert(array(0).asInstanceOf[MoeStringObject].getNativeValue === "1")
assert(array(1).asInstanceOf[MoeStringObject].getNativeValue === "2")
assert(array(2).asInstanceOf[MoeStringObject].getNativeValue === "3")
}

test("... basic test with a simple string range #4") {
val result = interpretCode(""" "a" .. "c" """)

val array: List[MoeObject] = result.asInstanceOf[MoeArrayObject].getNativeValue
Expand All @@ -32,4 +65,31 @@ class RangeLiteralTestSuite extends FunSuite with BeforeAndAfter with ParserTest
assert(array(2).asInstanceOf[MoeStringObject].getNativeValue === "c")
}

test("... basic test with a simple string range #5") {
val result = interpretCode(""" "z" .. "ab" """)

val array: List[MoeObject] = result.asInstanceOf[MoeArrayObject].getNativeValue

assert(array.size === 3)
assert(array(0).asInstanceOf[MoeStringObject].getNativeValue === "z")
assert(array(1).asInstanceOf[MoeStringObject].getNativeValue === "aa")
assert(array(2).asInstanceOf[MoeStringObject].getNativeValue === "ab")
}

test("... basic test with a simple string range #6") {
val result = interpretCode(""" "ab" .. "z" """)

val array: List[MoeObject] = result.asInstanceOf[MoeArrayObject].getNativeValue

assert(array.size === 0)
}

test("... basic test with a simple string range #7") {
val result = interpretCode(""" "zz" .. "a" """)

val array: List[MoeObject] = result.asInstanceOf[MoeArrayObject].getNativeValue

assert(array.size === 0)
}

}

0 comments on commit 56509b2

Please sign in to comment.