JS stdlib: added missed tests for Set and fixed HashSet implementations. Implemented Set::iterator, AbstractCollection::removeAll, AbstractCollection::retainAll, AbstractCollection::containsAll.

#KT-4390 fixed
This commit is contained in:
Zalim Bashorov
2014-01-28 22:38:32 +04:00
parent ceab4347ec
commit edb930fd76
5 changed files with 217 additions and 23 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2013 JetBrains s.r.o.
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,7 +20,7 @@ import junit.framework.Test;
//NOTE: well, it has tests
@SuppressWarnings("JUnitTestCaseWithNoTests")
public final class StdLibMapTest extends JsUnitTestBase {
public final class StdLibMapJsTest extends JsUnitTestBase {
public static Test suite() throws Exception {
return createTestSuiteForFile("libraries/stdlib/test/js/MapJsTest.kt");
}
@@ -0,0 +1,27 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* 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 org.jetbrains.k2js.test.semantics;
import junit.framework.Test;
@SuppressWarnings("JUnitTestCaseWithNoTests")
public final class StdLibSetJsTest extends JsUnitTestBase {
public static Test suite() throws Exception {
return createTestSuiteForFile("libraries/stdlib/test/js/SetJsTest.kt");
}
}
+40 -4
View File
@@ -112,6 +112,11 @@ String.prototype.contains = function (s) {
},
hasNext: function () {
return this.index < this.size;
},
remove: function () {
if (this.index < 0 || this.index > this.size) throw new RangeError();
this.index--;
this.array.splice(this.index, 1);
}
});
@@ -180,12 +185,43 @@ String.prototype.contains = function (s) {
size: function () {
return this.$size;
},
addAll: function (collection) {
addAll_5ib00d$: function (collection) {
var modified = false;
var it = collection.iterator();
var i = this.size();
while (i-- > 0) {
this.add(it.next());
while (it.hasNext()) {
if(this.add_s9cetl$(it.next()))
modified = true;
}
return modified
},
removeAll_5ib00d$: function (c) {
var modified = false;
var it = this.iterator();
while (it.hasNext()) {
if(c.contains_s9cetl$(it.next())) {
it.remove();
modified = true;
}
}
return modified
},
retainAll_5ib00d$: function (c) {
var modified = false;
var it = this.iterator();
while (it.hasNext()) {
if(!c.contains_s9cetl$(it.next())) {
it.remove();
modified = true;
}
}
return modified
},
containsAll_5ib00d$ : function (c) {
var it = c.iterator();
while (it.hasNext()) {
if (!this.contains_s9cetl$(it.next())) return false;
}
return true;
},
isEmpty: function () {
return this.size() === 0;
+35 -17
View File
@@ -504,14 +504,34 @@ Kotlin.ComplexHashMap = Kotlin.HashMap;
Kotlin.Set = Kotlin.createClassNow(Kotlin.Collection);
var SetIterator = Kotlin.createClassNow(Kotlin.Iterator,
function (set) {
this.set = set;
this.keys = set.toArray();
this.index = 0;
}, {
next: function() {
return this.keys[this.index++];
},
hasNext: function() {
return this.index < this.keys.length;
},
remove: function() {
this.set.remove_s9cetl$(this.keys[this.index - 1]);
}
});
Kotlin.PrimitiveHashSet = Kotlin.createClassNow(Kotlin.AbstractCollection,
function () {
this.$size = 0;
this.map = {};
}, {
contains: function (key) {
contains_s9cetl$: function (key) {
return this.map[key] === true;
},
iterator: function() {
return new SetIterator(this);
},
add_s9cetl$: function (element) {
var prevElement = this.map[element];
this.map[element] = true;
@@ -523,7 +543,7 @@ Kotlin.PrimitiveHashSet = Kotlin.createClassNow(Kotlin.AbstractCollection,
return true;
}
},
remove: function (element) {
remove_s9cetl$: function (element) {
if (this.map[element] === true) {
delete this.map[element];
this.$size--;
@@ -546,30 +566,28 @@ Kotlin.PrimitiveHashSet = Kotlin.createClassNow(Kotlin.AbstractCollection,
function HashSet(hashingFunction, equalityFunction) {
var hashTable = new Kotlin.HashTable(hashingFunction, equalityFunction);
this.addAll_5ib00d$ = Kotlin.AbstractCollection.prototype.addAll_5ib00d$;
this.removeAll_5ib00d$ = Kotlin.AbstractCollection.prototype.removeAll_5ib00d$;
this.retainAll_5ib00d$ = Kotlin.AbstractCollection.prototype.retainAll_5ib00d$;
this.containsAll_5ib00d$ = Kotlin.AbstractCollection.prototype.containsAll_5ib00d$;
this.add_s9cetl$ = function (o) {
hashTable.put_5yfy9u$(o, true);
return !hashTable.put_5yfy9u$(o, true);
};
this.addAll = function (arr) {
var i = arr.length;
while (i--) {
hashTable.put_5yfy9u$(arr[i], true);
}
};
this.values = function () {
this.toArray = function () {
return hashTable._keys();
};
this.iterator = function () {
return Kotlin.arrayIterator(this.values());
return new SetIterator(this);
};
this.remove = function (o) {
return hashTable.remove_s9cetl$(o) ? o : null;
this.remove_s9cetl$ = function (o) {
return hashTable.remove_s9cetl$(o) != null;
};
this.contains = function (o) {
this.contains_s9cetl$ = function (o) {
return hashTable.containsKey_s9cetl$(o);
};
@@ -587,7 +605,7 @@ Kotlin.PrimitiveHashSet = Kotlin.createClassNow(Kotlin.AbstractCollection,
this.clone = function () {
var h = new HashSet(hashingFunction, equalityFunction);
h.addAll(hashTable.keys());
h.addAll_5ib00d$(hashTable.keys());
return h;
};
@@ -654,7 +672,7 @@ Kotlin.PrimitiveHashSet = Kotlin.createClassNow(Kotlin.AbstractCollection,
this.isSubsetOf = function (hashSet) {
var values = hashTable.keys(), i = values.length;
while (i--) {
if (!hashSet.contains(values[i])) {
if (!hashSet.contains_s9cetl$(values[i])) {
return false;
}
}
+113
View File
@@ -0,0 +1,113 @@
package test.collections
import kotlin.test.*
import java.util.*
import org.junit.Test
class SetJsTest {
val data: Set<String> = createTestMutableSet()
val empty: Set<String> = hashSet<String>()
Test fun size() {
assertEquals(2, data.size())
assertEquals(0, empty.size())
}
Test fun isEmpty() {
assertFalse(data.isEmpty())
assertTrue(empty.isEmpty())
}
Test fun contains() {
assertTrue(data.contains("foo"))
assertTrue(data.contains("bar"))
assertFalse(data.contains("baz"))
assertFalse(data.contains(1))
assertFalse(empty.contains("foo"))
assertFalse(empty.contains("bar"))
assertFalse(empty.contains("baz"))
assertFalse(empty.contains(1))
}
Test fun iterator() {
var result = ""
for (e in data) {
result += e
}
assertTrue(result == "foobar" || result == "barfoo")
}
Test fun containsAll() {
assertTrue(data.containsAll(arrayList("foo", "bar")))
assertTrue(data.containsAll(arrayList<String>()))
assertFalse(data.containsAll(arrayList("foo", "bar", "baz")))
assertFalse(data.containsAll(arrayList("baz")))
}
Test fun add() {
val data = createTestMutableSet()
assertTrue(data.add("baz"))
assertEquals(3, data.size())
assertFalse(data.add("baz"))
assertEquals(3, data.size())
assertTrue(data.containsAll(arrayList("foo", "bar", "baz")))
}
Test fun remove() {
val data = createTestMutableSet()
assertTrue(data.remove("foo"))
assertEquals(1, data.size())
assertFalse(data.remove("foo"))
assertEquals(1, data.size())
assertTrue(data.contains("bar"))
}
Test fun addAll() {
val data = createTestMutableSet()
assertTrue(data.addAll(arrayList("foo", "bar", "baz", "boo")))
assertEquals(4, data.size())
assertFalse(data.addAll(arrayList("foo", "bar", "baz", "boo")))
assertEquals(4, data.size())
assertTrue(data.containsAll(arrayList("foo", "bar", "baz", "boo")))
}
Test fun removeAll() {
val data = createTestMutableSet()
assertFalse(data.removeAll(arrayList("baz")))
assertTrue(data.containsAll(arrayList("foo", "bar")))
assertEquals(2, data.size())
assertTrue(data.removeAll(arrayList("foo")))
assertTrue(data.contains("bar"))
assertEquals(1, data.size())
assertTrue(data.removeAll(arrayList("foo", "bar")))
assertEquals(0, data.size())
val data2 = createTestMutableSet()
assertFalse(data.removeAll(arrayList("foo", "bar", "baz")))
assertTrue(data.isEmpty())
}
Test fun retainAll() {
val data1 = createTestMutableSet()
assertTrue(data1.retainAll(arrayList("baz")))
assertTrue(data1.isEmpty())
val data2 = createTestMutableSet()
assertTrue(data2.retainAll(arrayList("foo")))
assertTrue(data2.contains("foo"))
assertEquals(1, data2.size())
}
Test fun clear() {
val data = createTestMutableSet()
data.clear()
assertTrue(data.isEmpty())
data.clear()
assertTrue(data.isEmpty())
}
//Helpers
fun createTestMutableSet(): MutableSet<String> = hashSet("foo", "bar")
}