package org.smoothbuild.db.values;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.emptyIterable;
import static org.hamcrest.Matchers.not;
import static org.smoothbuild.db.values.ValuesDb.memoryValuesDb;
import static org.smoothbuild.lang.type.Types.STRING_ARRAY;
import static org.testory.Testory.given;
import static org.testory.Testory.mock;
import static org.testory.Testory.thenReturned;
import static org.testory.Testory.thenThrown;
import static org.testory.Testory.when;
import org.junit.Before;
import org.junit.Test;
import org.smoothbuild.lang.value.Array;
import org.smoothbuild.lang.value.ArrayBuilder;
import org.smoothbuild.lang.value.Blob;
import org.smoothbuild.lang.value.SString;
public class ArrayTest {
private ValuesDb valuesDb;
private Blob blob;
private SString sstring;
private SString sstring2;
private SString sstring3;
private Array<?> array;
private ArrayBuilder<SString> arrayBuilder;
@SuppressWarnings("rawtypes")
private ArrayBuilder rawArrayBuilder;
@Before
public void before() {
valuesDb = memoryValuesDb();
}
@Test
public void empty_array_is_empty() throws Exception {
when(valuesDb.arrayBuilder(SString.class).build());
thenReturned(emptyIterable());
}
@Test
public void adding_null_is_forbidden() throws Exception {
given(arrayBuilder = valuesDb.arrayBuilder(SString.class));
when(arrayBuilder).add(sstring);
thenThrown(NullPointerException.class);
}
@Test
public void adding_element_with_wrong_smooth_type_is_forbidden() throws Exception {
given(rawArrayBuilder = valuesDb.arrayBuilder(SString.class));
given(blob = mock(Blob.class));
when(rawArrayBuilder).add(blob);
thenThrown(IllegalArgumentException.class);
}
@Test
public void array_contains_added_element() throws Exception {
given(arrayBuilder = valuesDb.arrayBuilder(SString.class));
given(sstring = valuesDb.string("abc"));
given(arrayBuilder).add(sstring);
when(arrayBuilder).build();
thenReturned(contains(sstring));
}
@Test
public void array_contains_added_elements_in_correct_order() throws Exception {
given(arrayBuilder = valuesDb.arrayBuilder(SString.class));
given(sstring = valuesDb.string("abc"));
given(sstring2 = valuesDb.string("def"));
given(sstring3 = valuesDb.string("ghi"));
given(arrayBuilder).add(sstring);
given(arrayBuilder).add(sstring2);
given(arrayBuilder).add(sstring3);
when(arrayBuilder.build());
thenReturned(contains(sstring, sstring2, sstring3));
}
@Test
public void adding_same_element_twice_builds_array_with_two_elements() throws Exception {
given(arrayBuilder = valuesDb.arrayBuilder(SString.class));
given(sstring = valuesDb.string("abc"));
given(arrayBuilder).add(sstring);
given(arrayBuilder).add(sstring);
when(arrayBuilder.build());
thenReturned(contains(sstring, sstring));
}
@Test
public void arrays_with_same_elements_have_same_hash() throws Exception {
given(arrayBuilder = valuesDb.arrayBuilder(SString.class));
given(sstring = valuesDb.string("abc"));
given(sstring2 = valuesDb.string("def"));
when(valuesDb.arrayBuilder(SString.class).add(sstring).add(sstring2).build().hash());
thenReturned(valuesDb.arrayBuilder(SString.class).add(sstring).add(sstring2).build().hash());
}
@Test
public void one_element_array_hash_is_different_than_its_element_hash() throws Exception {
given(arrayBuilder = valuesDb.arrayBuilder(SString.class));
given(sstring = valuesDb.string("abc"));
given(arrayBuilder).add(sstring);
given(array = arrayBuilder.build());
when(array.hash());
thenReturned(not(sstring.hash()));
}
@Test
public void arrays_with_same_elements_but_in_different_order_have_different_hashes()
throws Exception {
given(arrayBuilder = valuesDb.arrayBuilder(SString.class));
given(sstring = valuesDb.string("abc"));
given(sstring2 = valuesDb.string("def"));
when(valuesDb.arrayBuilder(SString.class).add(sstring).add(sstring2).build().hash());
thenReturned(not(valuesDb.arrayBuilder(SString.class).add(sstring2).add(sstring).build()
.hash()));
}
@Test
public void array_with_one_more_element_have_different_hash() throws Exception {
given(arrayBuilder = valuesDb.arrayBuilder(SString.class));
given(sstring = valuesDb.string("abc"));
given(sstring2 = valuesDb.string("def"));
when(valuesDb.arrayBuilder(SString.class).add(sstring).build().hash());
thenReturned(not(valuesDb.arrayBuilder(SString.class).add(sstring2).add(sstring).build()
.hash()));
}
@Test
public void array_can_be_read_back() throws Exception {
given(arrayBuilder = valuesDb.arrayBuilder(SString.class));
given(arrayBuilder).add(valuesDb.string("abc"));
given(arrayBuilder).add(valuesDb.string("def"));
given(array = arrayBuilder.build());
when(valuesDb.read(STRING_ARRAY, array.hash()));
thenReturned(array);
}
@Test
public void array_read_back_contains_same_elements() throws Exception {
given(arrayBuilder = valuesDb.arrayBuilder(SString.class));
given(sstring = valuesDb.string("abc"));
given(sstring2 = valuesDb.string("def"));
given(arrayBuilder).add(sstring);
given(arrayBuilder).add(sstring2);
given(array = arrayBuilder.build());
when(valuesDb.read(STRING_ARRAY, array.hash()));
thenReturned(contains(sstring, sstring2));
}
@Test
public void array_read_back_has_same_hash() throws Exception {
given(arrayBuilder = valuesDb.arrayBuilder(SString.class));
given(sstring = valuesDb.string("abc"));
given(sstring2 = valuesDb.string("def"));
given(arrayBuilder).add(sstring);
given(arrayBuilder).add(sstring2);
given(array = arrayBuilder.build());
when(valuesDb.read(STRING_ARRAY, array.hash()).hash());
thenReturned(array.hash());
}
@Test
public void to_string_contains_all_elements_in_square_brackets() throws Exception {
given(sstring = valuesDb.string("abc"));
given(sstring2 = valuesDb.string("def"));
given(arrayBuilder = valuesDb.arrayBuilder(SString.class));
given(arrayBuilder).add(sstring);
given(arrayBuilder).add(sstring2);
given(array = arrayBuilder.build());
when(array).toString();
thenReturned("[abc, def]");
}
}