/* * Copyright 2015 McDowell * * 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 uk.kludje.experimental.test.array; import org.junit.Assert; import org.junit.Test; import uk.kludje.experimental.collect.MutableSparseArray; import uk.kludje.experimental.collect.array.ArrayCollections; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.IntStream; public class MutableSparseArrayTest { @Test public void testPutAndGet() { String foo = "foo"; String bar = "bar"; MutableSparseArray<String> sparseArray = ArrayCollections.mutableSparseArray(); Assert.assertNotNull(sparseArray); Assert.assertEquals(0, sparseArray.size()); Assert.assertEquals(0, sparseArray.keyStream().count()); Assert.assertNull(sparseArray.get(Integer.MIN_VALUE)); sparseArray.put(Integer.MIN_VALUE, foo); Assert.assertEquals(1, sparseArray.size()); Assert.assertEquals(1, sparseArray.keyStream().count()); sparseArray.put(Integer.MAX_VALUE, foo); Assert.assertEquals(2, sparseArray.size()); Assert.assertEquals(2, sparseArray.keyStream().count()); sparseArray.put(Integer.MAX_VALUE, bar); Assert.assertEquals(2, sparseArray.size()); Assert.assertEquals(2, sparseArray.keyStream().count()); Assert.assertEquals(foo, sparseArray.get(Integer.MIN_VALUE)); Assert.assertEquals(bar, sparseArray.get(Integer.MAX_VALUE)); } @Test public void testGrow() { String foo = "foo"; int limit = 10_000; MutableSparseArray<String> sparseArray = ArrayCollections.mutableSparseArray(); for (int i = 0; i < limit; i++) { sparseArray.put(i, foo); } Assert.assertEquals(limit, sparseArray.size()); } @Test public void testRemoveHead() { int limit = 10; MutableSparseArray<Integer> sparseArray = ArrayCollections.mutableSparseArray(); Assert.assertNotNull(sparseArray); for (int i = 0; i < limit; i++) { sparseArray.put(i, i); } Assert.assertEquals(limit, sparseArray.size()); for (int i = 0; i < limit; i++) { boolean changed = sparseArray.remove(i); Assert.assertTrue(changed); Assert.assertNull(sparseArray.get(i)); } Assert.assertEquals(0, sparseArray.size()); } @Test public void testRemoveTail() { int limit = 10; MutableSparseArray<Integer> sparseArray = ArrayCollections.mutableSparseArray(); Assert.assertNotNull(sparseArray); for (int i = 0; i < limit; i++) { sparseArray.put(i, i); } Assert.assertEquals(limit, sparseArray.size()); for (int i = 0; i < limit; i++) { boolean changed = sparseArray.remove(i); Assert.assertTrue(changed); Assert.assertNull(sparseArray.get(i)); } Assert.assertEquals(0, sparseArray.size()); } @Test public void testRemoveBody() { int limit = 10; MutableSparseArray<Integer> sparseArray = ArrayCollections.mutableSparseArray(); Assert.assertNotNull(sparseArray); List<Integer> keys = new LinkedList<>(); for (int i = 0; i < limit; i++) { if (i % 2 == 0) { keys.add(i); } else { keys.add(0, i); } sparseArray.put(i, i); } Assert.assertEquals(limit, sparseArray.size()); Assert.assertFalse(sparseArray.isEmpty()); Assert.assertTrue(sparseArray.isNotEmpty()); for (int key : keys) { boolean changed = sparseArray.remove(key); Assert.assertTrue(changed); Assert.assertNull(sparseArray.get(key)); } Assert.assertEquals(0, sparseArray.size()); Assert.assertTrue(sparseArray.isEmpty()); Assert.assertFalse(sparseArray.isNotEmpty()); } @Test public void testKeyStream() { int limit = 10; MutableSparseArray<Integer> sparseArray = ArrayCollections.mutableSparseArray(); Assert.assertNotNull(sparseArray); Set<Integer> expectedKeys = new HashSet<>(); int removed = limit / 2; for (int i = 0; i < limit; i++) { sparseArray.put(i, i); if (i != removed) { expectedKeys.add(i); } } sparseArray.remove(removed); Assert.assertEquals(expectedKeys.size(), sparseArray.size()); // begin test IntStream stream = sparseArray.keyStream(); Assert.assertNotNull(stream); Set<Integer> actualKeys = stream.mapToObj(i -> i).collect(Collectors.toSet()); Assert.assertEquals(expectedKeys, actualKeys); } @Test public void testContains() { int limit = 10; MutableSparseArray<Integer> sparseArray = ArrayCollections.mutableSparseArray(); Assert.assertNotNull(sparseArray); Set<Integer> expectedKeys = new HashSet<>(); int removed = limit / 2; for (int i = 0; i < limit; i++) { sparseArray.put(i, i); if (i != removed) { expectedKeys.add(i); } } sparseArray.remove(removed); Assert.assertEquals(expectedKeys.size(), sparseArray.size()); // begin test for(Integer key: expectedKeys) { Assert.assertTrue(key.toString(), sparseArray.contains(key)); } } }