diff --git a/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/generator/CollectionBuilders.java b/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/generator/CollectionBuilders.java index 7fc22b9bd..1500926c4 100644 --- a/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/generator/CollectionBuilders.java +++ b/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/generator/CollectionBuilders.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Queue; import java.util.Set; import java.util.stream.Stream; @@ -46,6 +47,8 @@ public static Arbitrary build(Class clazz, List nodes) return MapEntryBuilder.INSTANCE.build(nodes); } else if (isOptional(clazz)) { return OptionalBuilder.INSTANCE.build(nodes); + } else if (isQueue(clazz)) { + return QueueBuilder.INSTANCE.build(nodes); } else { throw new IllegalArgumentException("Not implemented collection."); } @@ -79,4 +82,8 @@ private static boolean isMapEntry(Class clazz) { private static boolean isOptional(Class clazz) { return clazz.isAssignableFrom(Optional.class); } + + private static boolean isQueue(Class clazz) { + return clazz.isAssignableFrom(Queue.class); + } } diff --git a/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/generator/QueueBuilder.java b/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/generator/QueueBuilder.java new file mode 100644 index 000000000..d713c3b05 --- /dev/null +++ b/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/generator/QueueBuilder.java @@ -0,0 +1,60 @@ +/* + * Fixture Monkey + * + * Copyright (c) 2021-present NAVER Corp. + * + * 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 com.navercorp.fixturemonkey.generator; + +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; + +import net.jqwik.api.Arbitrary; +import net.jqwik.api.Combinators; + +import com.navercorp.fixturemonkey.arbitrary.ArbitraryNode; + +final class QueueBuilder { + public static QueueBuilder INSTANCE = new QueueBuilder(); + + @SuppressWarnings({"rawtypes", "unchecked"}) + Arbitrary build(List nodes) { + Combinators.BuilderCombinator queueBuilderCombinator = + Combinators.withBuilder(QueueBuilderFrame::new); + + if (nodes.isEmpty()) { + return (Arbitrary)queueBuilderCombinator.build(CollectionBuilderFrame::build); + } + + for (ArbitraryNode node : nodes) { + queueBuilderCombinator = queueBuilderCombinator + .use(node.getArbitrary()).in(CollectionBuilderFrame::add); + } + + return (Arbitrary)queueBuilderCombinator.build(CollectionBuilderFrame::build); + } + + private static class QueueBuilderFrame extends CollectionBuilderFrame { + public QueueBuilderFrame() { + super(new LinkedList<>()); + } + + @Override + Collection build() { + return new LinkedList<>(collection); + } + } +} diff --git a/fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyTest.java b/fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyTest.java index 5ce49854e..a4210fd26 100644 --- a/fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyTest.java +++ b/fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyTest.java @@ -61,8 +61,10 @@ import com.navercorp.fixturemonkey.test.FixtureMonkeyTestSpecs.MapKeyIntegerValueInteger; import com.navercorp.fixturemonkey.test.FixtureMonkeyTestSpecs.MapKeyIntegerValueString; import com.navercorp.fixturemonkey.test.FixtureMonkeyTestSpecs.MockInterface; +import com.navercorp.fixturemonkey.test.FixtureMonkeyTestSpecs.NestedStringQueue; import com.navercorp.fixturemonkey.test.FixtureMonkeyTestSpecs.NestedStringWithNotBlankList; import com.navercorp.fixturemonkey.test.FixtureMonkeyTestSpecs.StringAndInt; +import com.navercorp.fixturemonkey.test.FixtureMonkeyTestSpecs.StringQueue; import com.navercorp.fixturemonkey.test.FixtureMonkeyTestSpecs.StringWithNotBlank; import com.navercorp.fixturemonkey.test.FixtureMonkeyTestSpecs.StringWithNullable; @@ -1323,4 +1325,16 @@ void setSpec() { then(actual.getValue1().getValue()).isEqualTo("test"); } + + @Property + @Domain(FixtureMonkeyTestSpecs.class) + void giveMeQueue(@ForAll StringQueue expected) { + then(expected.getValues()).isNotNull(); + } + + @Property + @Domain(FixtureMonkeyTestSpecs.class) + void giveMeNestedQueue(@ForAll NestedStringQueue expected) { + then(expected.getValues()).isNotNull(); + } } diff --git a/fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyTestSpecs.java b/fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyTestSpecs.java index a1d48ea5b..92d41be21 100644 --- a/fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyTestSpecs.java +++ b/fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyTestSpecs.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Queue; import java.util.Set; import java.util.stream.Stream; @@ -63,6 +64,8 @@ class FixtureMonkeyTestSpecs extends AbstractDomainContextBase { registerArbitrary(StringAndInt.class, stringAndInt()); registerArbitrary(NestedStringWithNotBlankList.class, nestedStringWithNotBlankList()); registerArbitrary(ListWithAnnotation.class, listWithAnnotation()); + registerArbitrary(StringQueue.class, stringQueue()); + registerArbitrary(NestedStringQueue.class, nestedStringQueue()); } @Provide @@ -262,6 +265,26 @@ Arbitrary listWithAnnotation() { return SUT.giveMeArbitrary(ListWithAnnotation.class); } + @Data + public static class StringQueue { + private Queue values; + } + + @Provide + Arbitrary stringQueue() { + return SUT.giveMeArbitrary(StringQueue.class); + } + + @Data + public static class NestedStringQueue { + private Queue values; + } + + @Provide + Arbitrary nestedStringQueue() { + return SUT.giveMeArbitrary(NestedStringQueue.class); + } + public static class DefaultArbitraryGroup { public DefaultArbitraryGroup() { }