/*
* Copyright (c) 2006-2011 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit;
import java.util.concurrent.*;
import org.junit.*;
import static org.junit.Assert.*;
public final class MockedEnumsTest
{
enum MyEnum
{
First(true, 10, "First"),
Second(false, 6, "Second");
private final boolean flag;
private final int num;
private final String desc;
MyEnum(boolean flag, int num, String desc)
{
this.flag = flag;
this.num = num;
this.desc = desc;
}
public double getValue(double f) { return f * num; }
public String getDescription() { return num + desc + flag; }
}
@Test
public void mockEnumValues()
{
MyEnum.First.getDescription();
new Expectations()
{
final MyEnum mock = MyEnum.First;
{
MyEnum.values(); result = new MyEnum[] {mock};
mock.getValue(anyDouble); result = 50.0;
}
};
MyEnum[] values = MyEnum.values();
assertEquals(1, values.length);
double value = values[0].getValue(0.5);
assertEquals(50.0, value, 0.0);
}
@Test
public void mockInstanceMethodOnAnyEnumElement()
{
final double f = 2.5;
new NonStrictExpectations()
{
MyEnum mock;
{
mock.getValue(f); result = 12.3;
}
};
assertEquals(12.3, MyEnum.First.getValue(f), 0.0);
assertEquals(12.3, MyEnum.Second.getValue(f), 0.0);
}
@Test
public void mockSpecificEnumElementsByUsingTwoMockInstances()
{
new Expectations()
{
final MyEnum mock1 = MyEnum.First;
final MyEnum mock2 = MyEnum.Second;
{
mock1.getValue(anyDouble); result = 12.3;
mock2.getValue(anyDouble); result = -5.01;
}
};
assertEquals(12.3, MyEnum.First.getValue(2.5), 0.0);
assertEquals(-5.01, MyEnum.Second.getValue(1), 0.0);
}
@Test
public void mockSpecificEnumElementsByUsingASingleMockInstance(@NonStrict MyEnum unused)
{
new Expectations()
{
{
onInstance(MyEnum.First).getValue(anyDouble); result = 12.3;
onInstance(MyEnum.Second).getValue(anyDouble); result = -5.01;
}
};
assertEquals(-5.01, MyEnum.Second.getValue(1), 0.0);
assertEquals(12.3, MyEnum.First.getValue(2.5), 0.0);
}
@Test(expected = AssertionError.class)
public void mockSpecificEnumElementsByUsingASingleStrictMockInstance()
{
new Expectations()
{
@Mocked("getDescription") final MyEnum unused = null;
{
onInstance(MyEnum.First).getDescription();
onInstance(MyEnum.Second).getDescription();
}
};
MyEnum.Second.getDescription();
}
@Test
public void mockNonAbstractMethodsInEnumWithAbstractMethod(final TimeUnit tm) throws Exception
{
new Expectations()
{{
tm.convert(anyLong, TimeUnit.HOURS); result = 1L;
tm.sleep(anyLong);
}};
assertEquals(1, tm.convert(1000, TimeUnit.HOURS));
tm.sleep(10000);
}
public enum EnumWithValueSpecificMethods
{
One
{
@Override public int getValue() { return 1; }
@Override public String getDescription() { return "one"; }
},
Two
{
@Override public int getValue() { return 2; }
@Override public String getDescription() { return "two"; }
};
public abstract int getValue();
public String getDescription() { return String.valueOf(getValue()); }
}
@Test
public void mockEnumWithValueSpecificMethods(@Capturing EnumWithValueSpecificMethods mockedEnum)
{
assertSame(EnumWithValueSpecificMethods.One, mockedEnum);
new NonStrictExpectations()
{{
onInstance(EnumWithValueSpecificMethods.One).getValue(); result = 123;
onInstance(EnumWithValueSpecificMethods.Two).getValue(); result = -45;
onInstance(EnumWithValueSpecificMethods.One).getDescription(); result = "1";
onInstance(EnumWithValueSpecificMethods.Two).getDescription(); result = "2";
}};
assertEquals(123, EnumWithValueSpecificMethods.One.getValue());
assertEquals(-45, EnumWithValueSpecificMethods.Two.getValue());
assertEquals("1", EnumWithValueSpecificMethods.One.getDescription());
assertEquals("2", EnumWithValueSpecificMethods.Two.getDescription());
}
}