/* Copyright 2016 Immutables Authors and Contributors 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 org.immutables.fixture.nullable; import org.immutables.fixture.nullable.ImmutableNullableTypeUseJdtAccepted.Builder; import java.util.Arrays; import java.util.Collections; import org.junit.Test; import static org.immutables.check.Checkers.check; public class NullableAttributesTest { @Test public void defaultValues() { ImmutableNullableAttributes a1 = ImmutableNullableAttributes.builder() .build(); check(a1.array()).isNull(); check(a1.integer()).isNull(); check(a1.defArray()).isOf(Double.NaN); check(a1.list()).isNull(); check(a1.set()).notNull(); check(a1.set()).isEmpty(); check(a1.map()).isNull(); } @Test public void explicitNulls() { ImmutableNullableAttributes a1 = ImmutableNullableAttributes.builder() .set(null) .defArray((Double[]) null) .build(); check(a1.defArray()).isNull(); check(a1.set()).isNull(); } @Test public void simpleNullableDefaultExplicit() { ImmutableNullableDefault o1 = ImmutableNullableDefault.builder().build(); ImmutableNullableDefault o2 = ImmutableNullableDefault.builder() .intr(null) .str(null) .build(); check(o1.intr()).is(-1); check(o1.str()).is("def"); check(o2.intr()).isNull(); check(o2.str()).isNull(); } @Test public void nonDefaultValues() { ImmutableNullableAttributes a1 = ImmutableNullableAttributes.builder() .addSet(1) .defArray(1.0, 2.0) .addList("a") .addAllList(Arrays.asList("b", "c")) .putMap("key", new Object()) .build(); check(a1.set()).isOf(1); check(a1.defArray()).isOf(1.0, 2.0); check(a1.list()).isOf("a", "b", "c"); check(a1.map().keySet()).isOf("key"); } @Test public void fromNullCollection() { ImmutableFromNullCollection nullCollection = ImmutableFromNullCollection.builder() .freq(null) .items(null) .build(); ImmutableFromNullCollection fromNullCollection = ImmutableFromNullCollection.builder() .from(nullCollection) .build(); check(fromNullCollection.getItems()).isNull(); check(fromNullCollection.getFreq()).isNull(); } @Test public void compactConstruction() { ImmutableNullableCompact c1 = ImmutableNullableCompact.builder() .build(); check(ImmutableNullableCompact.of(null, null)).is(c1); } @Test(expected = NullPointerException.class) public void nonnullDefaultBlowupOnNull() { ImmutableNonnullConstruction.builder() .arr() .build(); } @Test public void nonnullDefault() { check(ImmutableNonnullConstruction.builder() .arr() .addAx("a") .addAx("b", "c") .build().ax()) .isOf("a", "b", "c"); } @Test public void skipNullElements() { ImmutableNullablyElements elements = ImmutableNullablyElements.builder() .addSk((String) null) .addSk("a") .addSk((String) null) .addSk(null, "b", null) .addAllSk(Arrays.asList(null, "c", "d")) .build(); check(elements.sk()).isOf("a", "b", "c", "d"); elements = elements.withSk("", null, ""); check(elements.sk()).isOf("", ""); } @Test public void skipNullValues() { ImmutableNullablyElements elements = ImmutableNullablyElements.builder() .putSm("a", null) .putSm("b", 1) .putAllSm(Collections.singletonMap("c", null)) .build(); check(elements.sm()).hasToString("{b=1}"); } @Test public void allowNulls() { ImmutableNullablyElements elements = ImmutableNullablyElements.builder() .addAl((Void) null) .addAl(null, null, null) .addAllAl(Arrays.asList((Void) null)) .putBl("a", null) .putBl(null, 1) // this is questionable, but let it be .build(); check(elements.al()).isOf(null, null, null, null, null); check(elements.bl()).hasToString("{a=null, null=1}"); } @Test public void banNulls() { ImmutableNullablyElements.Builder b = ImmutableNullablyElements.builder(); try { b.addRg((String) null); check(false); } catch (NullPointerException ex) { } try { b.addRg("a", null); check(false); } catch (NullPointerException ex) { } try { b.addAllRg(Arrays.asList("b", null)); check(false); } catch (NullPointerException ex) { } } @Test public void skipNullElements1() { ImmutableNullAnnElements elements = ImmutableNullAnnElements.builder() .addSk((String) null) .addSk("a") .addSk((String) null) .addSk(null, "b", null) .addAllSk(Arrays.asList(null, "c", "d")) .build(); check(elements.sk()).isOf("a", "b", "c", "d"); elements = elements.withSk("", null, ""); check(elements.sk()).isOf("", ""); } @Test public void skipNullValues2() { ImmutableNullAnnElements elements = ImmutableNullAnnElements.builder() .putSm("a", null) .putSm("b", 1) .putAllSm(Collections.singletonMap("c", null)) .build(); check(elements.sm()).hasToString("{b=1}"); } @Test public void allowNulls2() { ImmutableNullAnnElements elements = ImmutableNullAnnElements.builder() .addAl((Void) null) .addAl(null, null, null) .addAllAl(Arrays.asList((Void) null)) .putBl("a", null) .putBl(null, 1) // this is questionable, but let it be .build(); check(elements.al()).isOf(null, null, null, null, null); check(elements.bl()).hasToString("{a=null, null=1}"); } @Test public void banNulls2() { ImmutableNullAnnElements.Builder b = ImmutableNullAnnElements.builder(); try { b.addRg((String) null); check(false); } catch (NullPointerException ex) { } try { b.addRg("a", null); check(false); } catch (NullPointerException ex) { } try { b.addAllRg(Arrays.asList("b", null)); check(false); } catch (NullPointerException ex) { } } @Test public void typeUseNullable() { ImmutableNullableTypeUseJdtAccepted r = ImmutableNullableTypeUseJdtAccepted.builder() .i1(null) .l2(null) .build(); check(r.i1()).isNull(); check(r.l2()).isNull(); } }