summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Kossakowski <grek@google.com>2009-08-06 15:43:51 -0700
committerGrzegorz Kossakowski <grek@google.com>2009-08-06 15:43:51 -0700
commit393adbcb438b61b7362f743b6a77d08e318c97d2 (patch)
tree0678e585dabddc3eb854c439c4c05f98ba921c5e
parentc49bbaf5311c408bfb5323f3dd13fc26dc1f7c8e (diff)
downloadgimd-393adbcb438b61b7362f743b6a77d08e318c97d2.tar.gz
Added one, oneOption and all methods.
All three methods take field's name as argument. Implementation of all takes O(log(n)) time as selecting boundaries of range may take advantage of the fact that collection is sorted. Added test-case for Message testing all, one and oneOption methods. Signed-off-by: Grzegorz Kossakowski <grek@google.com>
-rw-r--r--src/main/scala/com/google/gimd/Message.scala32
-rw-r--r--src/test/scala/com/google/gimd/MessageTestCase.scala57
2 files changed, 86 insertions, 3 deletions
diff --git a/src/main/scala/com/google/gimd/Message.scala b/src/main/scala/com/google/gimd/Message.scala
index cfe7615..0e88bf9 100644
--- a/src/main/scala/com/google/gimd/Message.scala
+++ b/src/main/scala/com/google/gimd/Message.scala
@@ -14,9 +14,9 @@
package com.google.gimd;
-import collection.immutable.TreeSet
-import collection.Sorted
import com.google.gimd.text.Formatter
+import scala.collection.immutable.TreeSet
+import scala.collection.Sorted
object Message {
val empty: Message = new Message(TreeSet.empty)
@@ -39,7 +39,7 @@ final class Message(private val fields: Sorted[Field, Field])
}
override def compare(that: Message) = iterable2ordered(this.fields).compare(that.fields)
- override def compare(k0: Field, k1: Field) = k0.compare(k1)
+ override def compare(k0: Field, k1: Field) = k0.compare(k1)
def +(field: Field): Message = {
val buffer = new MessageBuffer
@@ -63,5 +63,31 @@ final class Message(private val fields: Sorted[Field, Field])
def iterator = new MessageIterator(this)
+ /**
+ * Returns all fields having name equal to given.
+ *
+ * This implementation is efficient because it does take advantage of the fact that Message is
+ * Sorted collection so operation is performed in O(log(n)) time.
+ */
+ def all(name: String): Sorted[Field,Field] = range(MinimumField(name), MaximumField(name))
+
+ /**
+ * @throws Predef.NoSuchElementException if there is more than one field with given name
+ */
+ def oneOption(name: String): Option[Field] = all(name).take(2).toList match {
+ case Nil => None
+ case x :: Nil => Some(x)
+ case x :: xs => throw new NoSuchElementException("There are more than one " +
+ "fields named " + name)
+ }
+
+ /**
+ * Returns field with passed name.
+ *
+ * @throws Predef.NoSuchElementException if either there's no element with given name or
+ * there are more than one
+ */
+ def one(name: String): Field = oneOption(name).get
+
override def toString = Formatter.format(this)
}
diff --git a/src/test/scala/com/google/gimd/MessageTestCase.scala b/src/test/scala/com/google/gimd/MessageTestCase.scala
new file mode 100644
index 0000000..a4aa3f9
--- /dev/null
+++ b/src/test/scala/com/google/gimd/MessageTestCase.scala
@@ -0,0 +1,57 @@
+// Copyright (C) 2009 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gimd
+
+import org.junit.Test
+import org.junit.Assert._
+
+class MessageTestCase {
+
+ @Test
+ def getAll {
+ val list = List(Field("name1", 2), Field("name1", "v1"))
+ val name0 = Field("name0", 0)
+ val message = Message(List(name0) ++ list ++ List(Field("name2", 3)))
+ assertEquals(List(name0), message.all("name0"))
+ assertEquals(list, message.all("name1"))
+ assertEquals(Nil, message.all("nonExistingName"))
+ }
+
+ @Test{val expected = classOf[NoSuchElementException]}
+ def getOneOptionOutOfMany {
+ val message = Message(Field("name", "value"), Field("name", 0))
+ message.oneOption("name")
+ }
+
+ @Test
+ def oneOption {
+ val message = Message(Field("name", "value"), Field("anotherName", 1))
+ assertEquals(Some(Field("name", "value")), message.oneOption("name"))
+ assertEquals(None, message.oneOption("nonExistingName"))
+ }
+
+ @Test{val expected = classOf[NoSuchElementException]}
+ def oneNonExisiting {
+ val message = Message(Field("name", "value"))
+ message.one("nonExistingName")
+ }
+
+ @Test
+ def oneExisting {
+ val message = Message(Field("name", "value"))
+ assertEquals(Field("name", "value"), message.one("name"))
+ }
+
+}