/**
* Copyright (c) 2016, All Contributors (see CONTRIBUTORS file)
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package com.eventsourcing.queries;
import com.eventsourcing.Model;
import com.eventsourcing.Repository;
import com.google.common.collect.Iterables;
import lombok.Value;
import lombok.experimental.Accessors;
import org.testng.annotations.Test;
import java.util.Collection;
import java.util.UUID;
import java.util.stream.Stream;
import static com.eventsourcing.queries.ModelCollectionQuery.LogicalOperators.and;
import static com.eventsourcing.queries.ModelCollectionQuery.LogicalOperators.or;
import static org.testng.Assert.assertEquals;
public class ModelCollectionQueryTest {
@Value
static class MyModel implements Model {
private Repository repository;
private UUID id;
@Accessors(fluent = true)
private String name;
}
static class MyQuery1 implements ModelCollectionQuery<MyModel> {
@Override public Stream<MyModel> getCollectionStream(Repository repository) {
return Stream.of(new MyModel(repository, UUID.nameUUIDFromBytes("test1".getBytes()), "test1"),
new MyModel(repository, UUID.nameUUIDFromBytes("test1_1".getBytes()), "test1_1"));
}
}
static class MyQuery2 implements ModelCollectionQuery<MyModel> {
@Override public Stream<MyModel> getCollectionStream(Repository repository) {
return Stream.of(new MyModel(repository, UUID.nameUUIDFromBytes("test2".getBytes()), "test2"),
new MyModel(repository, UUID.nameUUIDFromBytes("test1_1".getBytes()), "test1_1"));
}
}
@Test
public void query() {
Collection<MyModel> collection = ModelCollectionQuery.query(null, new MyQuery1());
Iterables.any(collection, m -> m.name().contains("test1"));
Iterables.any(collection, m -> m.name().contains("test1_1"));
}
@Test
public void queryAnd() {
Collection<MyModel> collection = ModelCollectionQuery.query(null, and(new MyQuery1(), new MyQuery2()));
assertEquals(collection.size(), 1);
Iterables.any(collection, m -> m.name().contains("test1_1"));
}
@Test
public void queryOr() {
Collection<MyModel> collection = ModelCollectionQuery.query(null, or(new MyQuery1(), new MyQuery2()));
assertEquals(collection.size(), 3);
Iterables.any(collection, m -> m.name().contains("test1"));
Iterables.any(collection, m -> m.name().contains("test1_1"));
Iterables.any(collection, m -> m.name().contains("test2"));
}
}