/*******************************************************************************
* Copyright (c) 2015 EfficiOS Inc., Alexandre Montplaisir
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.eclipse.tracecompass.common.core.tests;
import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNullContents;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.common.core.NonNullUtils;
import org.junit.Test;
/**
* Tests for {@link NonNullUtils}.
*/
public class NonNullUtilsTest {
/**
* Test code to ensure the null-annotations on
* {@link NonNullUtils#checkNotNullContents(Stream)} work correctly.
*
* Not mean to be run as a {@link Test}, the code should simply not produce
* any compilation errors or warnings.
*/
public void testAnnotationsCheckNotNullContentsStream() {
Stream<String> a = (new ArrayList<String>()).stream();
Stream<@Nullable String> b = (new ArrayList<@Nullable String>()).stream();
@Nullable Stream<String> c = (new ArrayList<String>()).stream();
@Nullable Stream<@Nullable String> d = (new ArrayList<@Nullable String>()).stream();
Stream<@Nullable String> e = (new ArrayList<@Nullable String>()).stream();
@NonNull Stream<String> f = checkNotNull((new ArrayList<String>()).stream());
@NonNull Stream<@NonNull String> g = checkNotNull((new ArrayList<@NonNull String>()).stream());
@NonNull Stream<@NonNull String> checkedA = checkNotNullContents(a);
@NonNull Stream<@NonNull String> checkedB = checkNotNullContents(b);
@NonNull Stream<@NonNull String> checkedC = checkNotNullContents(c);
@NonNull Stream<@NonNull String> checkedD = checkNotNullContents(d);
@NonNull Stream<@NonNull String> checkedE = checkNotNullContents(e);
@NonNull Stream<@NonNull String> checkedF = checkNotNullContents(f);
@NonNull Stream<@NonNull String> checkedG = checkNotNullContents(g);
assertNotNull(checkedA);
assertNotNull(checkedB);
assertNotNull(checkedC);
assertNotNull(checkedD);
assertNotNull(checkedE);
assertNotNull(checkedF);
assertNotNull(checkedG);
}
/**
* Test code to ensure the null-annotations on
* {@link NonNullUtils#checkNotNullContents(Object[])} work correctly.
*
* Not mean to be run as a {@link Test}, the code should simply not produce
* any compilation errors or warnings.
*/
public void testAnnotationsCheckNotNullContentsArray() {
String[] a = new String[] {};
@Nullable String[] b = new @Nullable String[] {};
String @Nullable [] c = new String[] {};
@Nullable String @Nullable [] d = new @Nullable String[] {};
@NonNull String[] e = new @NonNull String[] {};
String @NonNull [] f = new String[] {};
@NonNull String @NonNull [] g = new @NonNull String[] {};
@NonNull String @NonNull [] checkedA = checkNotNullContents(a);
@NonNull String @NonNull [] checkedB = checkNotNullContents(b);
@NonNull String @NonNull [] checkedC = checkNotNullContents(c);
@NonNull String @NonNull [] checkedD = checkNotNullContents(d);
@NonNull String @NonNull [] checkedE = checkNotNullContents(e);
@NonNull String @NonNull [] checkedF = checkNotNullContents(f);
@NonNull String @NonNull [] checkedG = checkNotNullContents(g);
assertNotNull(checkedA);
assertNotNull(checkedB);
assertNotNull(checkedC);
assertNotNull(checkedD);
assertNotNull(checkedE);
assertNotNull(checkedF);
assertNotNull(checkedG);
}
/**
* Test {@link NonNullUtils#checkNotNullContents(Stream)} for a stream
* containing no null elements.
*/
@Test
public void testCheckContentsStream() {
List<@Nullable String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
List<@NonNull String> out = checkNotNullContents(list.stream()).collect(Collectors.toList());
assertEquals(list, out);
}
/**
* Test {@link NonNullUtils#checkNotNullContents(Stream)} with a null
* reference (should fail immediately).
*/
@Test(expected = NullPointerException.class)
public void testCheckContentsStreamNullRef() {
checkNotNullContents((Stream<@Nullable ?>) null);
}
/**
* Test {@link NonNullUtils#checkNotNullContents(Stream)} with a stream
* containing a null value.
*/
@Test(expected = NullPointerException.class)
public void testCheckContentsStreamNullElement() {
List<@Nullable String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add(null);
list.add("d");
/*
* Should fail.
*
* Don't forget we need a terminal operation to process the contents of
* the stream!
*/
checkNotNullContents(list.stream()).collect(Collectors.toList());
}
/**
* Test {@link NonNullUtils#checkNotNullContents(Object[])} for an array
* containing no null elements.
*/
@Test
public void testCheckContentsArray() {
@Nullable String[] array = new @Nullable String[3];
array[0] = "a";
array[1] = "b";
array[2] = "c";
@NonNull String[] out = checkNotNullContents(array);
assertArrayEquals(array, out);
}
/**
* Test {@link NonNullUtils#checkNotNullContents(Object[])} with a null
* reference (should fail immediately).
*/
@Test(expected = NullPointerException.class)
public void testCheckContentsArrayNullRef() {
checkNotNullContents((@Nullable Object[]) null);
}
/**
* Test {@link NonNullUtils#checkNotNullContents(Object[])} with an array
* containing a null value.
*/
@Test(expected = NullPointerException.class)
public void testCheckContentsArrayNullElement() {
@Nullable String[] array = new @Nullable String[3];
array[0] = "a";
array[1] = null;
array[2] = "c";
/* Should fail */
checkNotNullContents(array);
}
}