diff options
author | Grzegorz Kossakowski <grek@google.com> | 2009-08-06 15:43:51 -0700 |
---|---|---|
committer | Grzegorz Kossakowski <grek@google.com> | 2009-08-06 15:43:51 -0700 |
commit | 393adbcb438b61b7362f743b6a77d08e318c97d2 (patch) | |
tree | 0678e585dabddc3eb854c439c4c05f98ba921c5e | |
parent | c49bbaf5311c408bfb5323f3dd13fc26dc1f7c8e (diff) | |
download | gimd-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.scala | 32 | ||||
-rw-r--r-- | src/test/scala/com/google/gimd/MessageTestCase.scala | 57 |
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")) + } + +} |