package com.googlecode.totallylazy.structural;
import com.googlecode.totallylazy.Some;
import org.junit.Test;
import java.io.Closeable;
import java.util.concurrent.atomic.AtomicBoolean;
import static com.googlecode.totallylazy.Option.none;
import static com.googlecode.totallylazy.matchers.Matchers.is;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.MatcherAssert.assertThat;
public class StructuralTest {
@Test
public void canStructurallyCast() throws Exception {
final AtomicBoolean called = new AtomicBoolean(false);
Object closeable = new Object() {
void close() {
called.set(true);
}
};
Closeable close = Structural.cast(Closeable.class, closeable);
close.close();
assertThat(called.get(), is(true));
}
@Test
public void throwsWhenDoesNotFulfillStructuralContract() throws Exception {
try {
Structural.cast(Closeable.class, new Object());
} catch (ClassCastException e) {
}
}
@Test
public void canCastOption() throws Exception {
assertThat(Structural.castOption(Closeable.class, new Object() {
void close() {}
}), instanceOf(Some.class));
assertThat(Structural.castOption(Closeable.class, new Object()), is(none(Closeable.class)));
}
@Test
public void canCheckInstanceOf() throws Exception {
assertThat(Structural.instanceOf(Closeable.class, new Object() {
void close() {}
}), is(true));
assertThat(Structural.instanceOf(Closeable.class, new Object()), is(false));
}
}