/*
* Copyright 2011 Goldman Sachs.
*
* 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.gs.collections.impl.factory;
import com.gs.collections.api.factory.stack.ImmutableStackFactory;
import com.gs.collections.api.stack.ImmutableStack;
import com.gs.collections.impl.stack.mutable.ArrayStack;
import com.gs.collections.impl.test.Verify;
import org.junit.Assert;
import org.junit.Test;
public class StacksTest
{
@Test
public void immutables()
{
ImmutableStackFactory stackFactory = Stacks.immutable;
Assert.assertEquals(ArrayStack.newStack(), stackFactory.of());
Verify.assertInstanceOf(ImmutableStack.class, stackFactory.of());
Assert.assertEquals(ArrayStack.newStackWith(1), stackFactory.of(1));
Verify.assertInstanceOf(ImmutableStack.class, stackFactory.of(1));
Assert.assertEquals(ArrayStack.newStackWith(1, 2), stackFactory.of(1, 2));
Verify.assertInstanceOf(ImmutableStack.class, stackFactory.of(1, 2));
Assert.assertEquals(ArrayStack.newStackWith(1, 2, 3), stackFactory.of(1, 2, 3));
Verify.assertInstanceOf(ImmutableStack.class, stackFactory.of(1, 2, 3));
Assert.assertEquals(ArrayStack.newStackWith(1, 2, 3, 4), stackFactory.of(1, 2, 3, 4));
Verify.assertInstanceOf(ImmutableStack.class, stackFactory.of(1, 2, 3, 4));
Assert.assertEquals(ArrayStack.newStackWith(1, 2, 3, 4, 5), stackFactory.of(1, 2, 3, 4, 5));
Verify.assertInstanceOf(ImmutableStack.class, stackFactory.of(1, 2, 3, 4, 5));
Assert.assertEquals(ArrayStack.newStackWith(1, 2, 3, 4, 5, 6), stackFactory.of(1, 2, 3, 4, 5, 6));
Verify.assertInstanceOf(ImmutableStack.class, stackFactory.of(1, 2, 3, 4, 5, 6));
Assert.assertEquals(ArrayStack.newStackWith(1, 2, 3, 4, 5, 6, 7), stackFactory.of(1, 2, 3, 4, 5, 6, 7));
Verify.assertInstanceOf(ImmutableStack.class, stackFactory.of(1, 2, 3, 4, 5, 6, 7));
Assert.assertEquals(ArrayStack.newStackWith(1, 2, 3, 4, 5, 6, 7, 8), stackFactory.of(1, 2, 3, 4, 5, 6, 7, 8));
Verify.assertInstanceOf(ImmutableStack.class, stackFactory.of(1, 2, 3, 4, 5, 6, 7, 8));
Assert.assertEquals(ArrayStack.newStackWith(1, 2, 3, 4, 5, 6, 7, 8, 9), stackFactory.of(1, 2, 3, 4, 5, 6, 7, 8, 9));
Verify.assertInstanceOf(ImmutableStack.class, stackFactory.of(1, 2, 3, 4, 5, 6, 7, 8, 9));
Assert.assertEquals(ArrayStack.newStackWith(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), stackFactory.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
Verify.assertInstanceOf(ImmutableStack.class, stackFactory.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
Assert.assertEquals(ArrayStack.newStackWith(3, 2, 1), stackFactory.ofAll(ArrayStack.newStackWith(1, 2, 3)));
Verify.assertInstanceOf(ImmutableStack.class, stackFactory.ofAll(ArrayStack.newStackWith(1, 2, 3)));
}
@Test
public void emptyStack()
{
Assert.assertTrue(Stacks.immutable.of().isEmpty());
}
@Test
public void newStackWith()
{
ImmutableStack<String> stack = Stacks.immutable.of();
Assert.assertEquals(stack, Stacks.immutable.of(stack.toArray()));
Assert.assertEquals(stack = stack.push("1"), Stacks.immutable.of("1"));
Assert.assertEquals(stack = stack.push("2"), Stacks.immutable.of("1", "2"));
Assert.assertEquals(stack = stack.push("3"), Stacks.immutable.of("1", "2", "3"));
Assert.assertEquals(stack = stack.push("4"), Stacks.immutable.of("1", "2", "3", "4"));
Assert.assertEquals(stack = stack.push("5"), Stacks.immutable.of("1", "2", "3", "4", "5"));
Assert.assertEquals(stack = stack.push("6"), Stacks.immutable.of("1", "2", "3", "4", "5", "6"));
Assert.assertEquals(stack = stack.push("7"), Stacks.immutable.of("1", "2", "3", "4", "5", "6", "7"));
Assert.assertEquals(stack = stack.push("8"), Stacks.immutable.of("1", "2", "3", "4", "5", "6", "7", "8"));
Assert.assertEquals(stack = stack.push("9"), Stacks.immutable.of("1", "2", "3", "4", "5", "6", "7", "8", "9"));
Assert.assertEquals(stack = stack.push("10"), Stacks.immutable.of("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"));
Assert.assertEquals(stack = stack.push("11"), Stacks.immutable.of("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"));
Assert.assertEquals(stack = stack.push("12"), Stacks.immutable.of("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"));
}
@SuppressWarnings("RedundantArrayCreation")
@Test
public void newStackWithArray()
{
ImmutableStack<String> stack = Stacks.immutable.of();
Assert.assertEquals(stack = stack.push("1"), Stacks.immutable.of(new String[]{"1"}));
Assert.assertEquals(stack = stack.push("2"), Stacks.immutable.of(new String[]{"1", "2"}));
Assert.assertEquals(stack = stack.push("3"), Stacks.immutable.of(new String[]{"1", "2", "3"}));
Assert.assertEquals(stack = stack.push("4"), Stacks.immutable.of(new String[]{"1", "2", "3", "4"}));
Assert.assertEquals(stack = stack.push("5"), Stacks.immutable.of(new String[]{"1", "2", "3", "4", "5"}));
Assert.assertEquals(stack = stack.push("6"), Stacks.immutable.of(new String[]{"1", "2", "3", "4", "5", "6"}));
Assert.assertEquals(stack = stack.push("7"), Stacks.immutable.of(new String[]{"1", "2", "3", "4", "5", "6", "7"}));
Assert.assertEquals(stack = stack.push("8"), Stacks.immutable.of(new String[]{"1", "2", "3", "4", "5", "6", "7", "8"}));
Assert.assertEquals(stack = stack.push("9"), Stacks.immutable.of(new String[]{"1", "2", "3", "4", "5", "6", "7", "8", "9"}));
Assert.assertEquals(stack = stack.push("10"), Stacks.immutable.of(new String[]{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}));
Assert.assertEquals(stack = stack.push("11"), Stacks.immutable.of("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"));
}
@Test
public void newStackWithStack()
{
ImmutableStack<String> stack = Stacks.immutable.of();
ArrayStack<String> arrayStack = ArrayStack.newStackWith("1");
Assert.assertEquals(stack = stack.push("1"), arrayStack.toImmutable());
arrayStack.push("2");
Assert.assertEquals(stack = stack.push("2"), arrayStack.toImmutable());
arrayStack.push("3");
Assert.assertEquals(stack = stack.push("3"), arrayStack.toImmutable());
arrayStack.push("4");
Assert.assertEquals(stack = stack.push("4"), arrayStack.toImmutable());
arrayStack.push("5");
Assert.assertEquals(stack = stack.push("5"), arrayStack.toImmutable());
arrayStack.push("6");
Assert.assertEquals(stack = stack.push("6"), arrayStack.toImmutable());
arrayStack.push("7");
Assert.assertEquals(stack = stack.push("7"), arrayStack.toImmutable());
arrayStack.push("8");
Assert.assertEquals(stack = stack.push("8"), arrayStack.toImmutable());
arrayStack.push("9");
Assert.assertEquals(stack = stack.push("9"), arrayStack.toImmutable());
arrayStack.push("10");
Assert.assertEquals(stack = stack.push("10"), arrayStack.toImmutable());
arrayStack.push("11");
Assert.assertEquals(stack = stack.push("11"), arrayStack.toImmutable());
}
@Test
public void newStackWithWithStack()
{
ArrayStack<Object> expected = ArrayStack.newStack();
Assert.assertEquals(expected, Stacks.mutable.ofAll(ArrayStack.newStack()));
expected.push(1);
Assert.assertEquals(ArrayStack.newStackWith(1), Stacks.mutable.ofAll(expected));
expected.push(2);
Assert.assertEquals(ArrayStack.newStackWith(2, 1), Stacks.mutable.ofAll(expected));
}
@Test
public void classIsNonInstantiable()
{
Verify.assertClassNonInstantiable(Stacks.class);
}
}