package tc.oc.document;
import java.util.Collections;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.inject.Inject;
import org.junit.Test;
import tc.oc.ApiTest;
import tc.oc.api.annotations.Serialize;
import tc.oc.api.docs.virtual.BasicDocument;
import tc.oc.api.docs.virtual.Document;
import tc.oc.api.document.DocumentGenerator;
import tc.oc.api.document.DocumentRegistry;
import static org.junit.Assert.*;
import static tc.oc.test.Assert.*;
@Serialize interface Empty extends Document {}
@Serialize interface RequiredPrimitive extends Document { int woot(); }
@Serialize interface PrimitiveWithDefault extends Document { default int woot() { return 123; } }
@Serialize interface NullablePrimitive extends Document { @Nullable Integer woot(); }
@Serialize interface NonNullObject extends Document { @Nonnull String woot(); }
public class DocumentGeneratorTest extends ApiTest {
@Inject DocumentRegistry registry;
@Inject DocumentGenerator generator;
@Test
public void testSimpleDocument() throws Exception {
final RequiredPrimitive doc = registry.instantiate(RequiredPrimitive.class, Collections.singletonMap("woot", 123));
assertEquals(123, doc.woot());
}
@Test
public void testMissingPrimitive() throws Exception {
try {
registry.instantiate(RequiredPrimitive.class, Collections.emptyMap());
fail();
} catch(IllegalArgumentException e) {
// pass
}
}
@Test
public void testNullPrimitive() throws Exception {
try {
registry.instantiate(RequiredPrimitive.class, Collections.singletonMap("woot", null));
fail();
} catch(NullPointerException e) {
// pass
}
}
@Test
public void testNonNullObjectWithExplicitNull() throws Exception {
try {
registry.instantiate(NonNullObject.class, Collections.singletonMap("woot", null));
fail();
} catch(NullPointerException e) {
// pass
}
}
@Test
public void testMissingNonNullObject() throws Exception {
try {
registry.instantiate(NonNullObject.class, Collections.emptyMap());
fail();
} catch(IllegalArgumentException e) {
// pass
}
}
@Test
public void testPrimitiveTypeValidation() throws Exception {
try {
registry.instantiate(RequiredPrimitive.class, Collections.singletonMap("woot", "lol"));
fail();
} catch(ClassCastException e) {
// pass
}
}
@Test
public void testPrimitiveDefault() throws Exception {
final PrimitiveWithDefault doc = registry.instantiate(PrimitiveWithDefault.class, Collections.emptyMap());
assertEquals(123, doc.woot());
}
@Test
public void testValueForPrimitiveDefault() throws Exception {
final PrimitiveWithDefault doc = registry.instantiate(PrimitiveWithDefault.class, Collections.singletonMap("woot", 456));
assertEquals(456, doc.woot());
}
@Test
public void testPrimitiveDefaultWithExplicitNull() throws Exception {
try {
registry.instantiate(PrimitiveWithDefault.class, Collections.singletonMap("woot", null));
fail();
} catch(NullPointerException e) {
// pass
}
}
@Test
public void testNullablePrimitiveWithExplicitNull() throws Exception {
final NullablePrimitive doc = registry.instantiate(NullablePrimitive.class, Collections.singletonMap("woot", null));
assertNull(doc.woot());
}
@Test
public void testNullablePrimitiveWithImplicitNull() throws Exception {
final NullablePrimitive doc = registry.instantiate(NullablePrimitive.class, Collections.emptyMap());
assertNull(doc.woot());
}
@Test
public void testBaseMethod() throws Exception {
final BasicDocument base = new BasicDocument();
final int code = generator.instantiate(registry.getMeta(Empty.class), base, Collections.emptyMap()).hashCode();
assertEquals(base.hashCode(), code);
}
}