/* * 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.test; import org.junit.Test; import uk.kludje.Nullifier; import java.io.IOException; import static org.junit.Assert.*; public class NullifierTest { @Test public void testNullHandling() { Nullifier<String, String> nullifier = s -> s.concat(s); // not null String str = nullifier.apply("foo"); assertEquals("foofoo", str); // null String nullStr = nullifier.apply(null); assertNull(nullStr); } @Test public void testSimpleEval() { // setup A a = null; // invoke B result = Nullifier.eval(a, A::getB); // verify assertNull(result); } @Test public void testSpan() { // setup A a = new A(); a.b = new B(); a.b.c = new C(); a.b.c.d = new D(); // invoke D d = Nullifier.span(A::getB, B::getC, C::getD).apply(a); // verify assertEquals(a.b.c.d, d); } @Test(expected = IOException.class) public void testExceptionHandling() { // setup A a = new A(); a.b = new B(); a.b.c = new C(); a.b.c.d = new D(); // invoke D d = Nullifier.span(A::getB, B::getC, this::throwACheckedException).apply(a); // verify assertEquals(a.b.c.d, d); } @SuppressWarnings("UnusedParameters") private D throwACheckedException(C c) throws IOException { throw new IOException("expected"); } @Test public void testNullSpan() { // setup A a = new A(); // invoke D d = Nullifier.span(A::getB, B::getC, C::getD).apply(a); // verify assertNull(d); } @Test public void testPartialSpan() { // setup A a = new A(); a.b = new B(); // invoke D d = Nullifier.span(A::getB, B::getC, C::getD).apply(a); // verify assertNull(d); } @Test public void testSpan2() { // setup A a = new A(); a.b = new B(); a.b.c = new C(); a.b.c.d = new D(); // invoke C c = Nullifier.span(A::getB, B::getC).apply(a); // verify assertEquals(a.b.c, c); } @Test public void testSpan4() { // setup A a = new A(); a.b = new B(); a.b.c = new C(); a.b.c.d = new D(); a.b.c.d.e = new E(); // invoke E e = Nullifier.span(A::getB, B::getC, C::getD, D::getE).apply(a); // verify assertEquals(a.b.c.d.e, e); } @Test public void testSpan5() { // setup A a = new A(); a.b = new B(); a.b.c = new C(); a.b.c.d = new D(); a.b.c.d.e = new E(); a.b.c.d.e.f = new F(); // invoke F f = Nullifier.span(A::getB, B::getC, C::getD, D::getE, E::getF).apply(a); // verify assertEquals(a.b.c.d.e.f, f); } @Test public void testSpan6() { // setup A a = new A(); a.b = new B(); a.b.c = new C(); a.b.c.d = new D(); a.b.c.d.e = new E(); a.b.c.d.e.f = new F(); a.b.c.d.e.f.g = new G(); // invoke G g = Nullifier.span(A::getB, B::getC, C::getD, D::getE, E::getF) .andThenSpan(F::getG) .apply(a); // verify assertEquals(a.b.c.d.e.f.g, g); } @Test public void testIsNullSpan() { // setup A a = new A(); a.b = new B(); a.b.c = new C(); a.b.c.d = new D(); // invoke boolean state = Nullifier.isNull(a, A::getB, B::getC, C::getD); // verify assertFalse(state); } @Test public void testIsNull() { // invoke boolean state = Nullifier.isNull(null, A::getB, B::getC, C::getD); // verify assertTrue(state); } @Test public void testIsPartialNull() { // setup A a = new A(); a.b = new B(); // invoke boolean state = Nullifier.isNull(a, A::getB, B::getC, C::getD); // verify assertTrue(state); } @Test public void testNotNull1() { // setup A a = new A(); a.b = new B(); // invoke boolean state = Nullifier.isNull(a, A::getB); // verify assertFalse(state); } @Test public void testNull1() { // setup A a = new A(); // invoke boolean state = Nullifier.isNull(a, A::getB); // verify assertTrue(state); } @Test public void testNotNull2() { // setup A a = new A(); a.b = new B(); a.b.c = new C(); a.b.c.d = new D(); // invoke boolean state = Nullifier.isNull(a, A::getB, B::getC); // verify assertFalse(state); } @Test public void testNull2() { // setup A a = new A(); a.b = new B(); // invoke boolean state = Nullifier.isNull(a, A::getB, B::getC); // verify assertTrue(state); } @Test public void testNotNull3() { // setup A a = new A(); a.b = new B(); a.b.c = new C(); a.b.c.d = new D(); // invoke boolean state = Nullifier.isNull(a, A::getB, B::getC, C::getD); // verify assertFalse(state); } @Test public void testNull3() { // setup A a = new A(); a.b = new B(); a.b.c = new C(); // invoke boolean state = Nullifier.isNull(a, A::getB, B::getC, C::getD); // verify assertTrue(state); } @Test public void testNotNull4() { // setup A a = new A(); a.b = new B(); a.b.c = new C(); a.b.c.d = new D(); a.b.c.d.e = new E(); // invoke boolean state = Nullifier.isNull(a, A::getB, B::getC, C::getD, D::getE); // verify assertFalse(state); } @Test public void testNull4() { // setup A a = new A(); a.b = new B(); a.b.c = new C(); a.b.c.d = new D(); // invoke boolean state = Nullifier.isNull(a, A::getB, B::getC, C::getD, D::getE); // verify assertTrue(state); } @Test public void testNotNull5() { // setup A a = new A(); a.b = new B(); a.b.c = new C(); a.b.c.d = new D(); a.b.c.d.e = new E(); a.b.c.d.e.f = new F(); // invoke boolean state = Nullifier.isNull(a, A::getB, B::getC, C::getD, D::getE, E::getF); // verify assertFalse(state); } @Test public void testNull5() { // setup A a = new A(); a.b = new B(); a.b.c = new C(); a.b.c.d = new D(); a.b.c.d.e = new E(); // invoke boolean state = Nullifier.isNull(a, A::getB, B::getC, C::getD, D::getE, E::getF); // verify assertTrue(state); } /** Inheritance tests check for generics compilation problems. */ @Test public void testInheritanceCompilation2() { // setup Nullifier<String, CharSequence> nullifier = Nullifier.span(this::toCharSequence, this::toCharSequence); // invoke CharSequence foo = nullifier.apply("foo"); // verify assertEquals("foo", foo); } @Test public void testInheritanceCompilation3() { // setup Nullifier<String, CharSequence> nullifier = Nullifier.span(this::toCharSequence, this::toCharSequence, this::toCharSequence); // invoke CharSequence foo = nullifier.apply("foo"); // verify assertEquals("foo", foo); } @Test public void testInheritanceCompilation4() { // setup Nullifier<String, CharSequence> nullifier = Nullifier.span(this::toCharSequence, this::toCharSequence, this::toCharSequence, this::toCharSequence); // invoke CharSequence foo = nullifier.apply("foo"); // verify assertEquals("foo", foo); } @Test public void testOrElseSpan() { // setup A a = new A(); D expected = new D(); // invoke D d = Nullifier.span(A::getB, B::getC, C::getD).applyOr(a, expected); // verify assertEquals(expected, d); } @Test public void testOrElseSpanOk() { // setup A a = new A(); a.b = new B(); a.b.c = new C(); // invoke C c = Nullifier.span(A::getB, B::getC).applyOr(a, new C()); // verify assertEquals(a.b.c, c); } @Test public void testOrElseGetSpan() { // setup A a = new A(); // invoke D d = Nullifier.span(A::getB, B::getC, C::getD).applyOrGet(a, D::new); // verify assertNotNull(d); } @Test public void testOrElseGetSpanOk() { // setup A a = new A(); a.b = new B(); a.b.c = new C(); // invoke C c = Nullifier.span(A::getB, B::getC).applyOrGet(a, C::new); // verify assertEquals(a.b.c, c); } private CharSequence toCharSequence(Object cs) { return cs.toString(); } static class A { B b; B getB() { return b; } } static class B { C c; C getC() { return c; } } static class C { D d; D getD() { return d; } } static class D { E e; E getE() { return e; } } static class E { F f; F getF() { return f; } } static class F { G g; G getG() { return g; } } static class G {} }