From bd0aaedba40efe7089bbe3086a4be7ece11b86a6 Mon Sep 17 00:00:00 2001 From: Mathieu Boretti Date: Sat, 30 May 2020 13:58:22 +0200 Subject: [PATCH] Issue #331 - Add a way to ignore fields in hasSameValue --- pom.xml | 1 + .../children/pom.xml | 5 + .../matchers/multi/children/Pojo24.java | 51 ++++++++++ .../matchers/multi/children/Pojo26.java | 47 +++++++++ .../parent-old/pom.xml | 68 +++++++++++++ .../matchers/multi/parentold/Pojo1.java | 45 +++++++++ .../matchers/multi/parentold/Pojo2.java | 42 ++++++++ src/it/multimodule-nogeneric-it-jdk8/pom.xml | 1 + .../children/pom.xml | 5 + .../matchers/multi/children/Pojo24.java | 51 ++++++++++ .../matchers/multi/children/Pojo26.java | 47 +++++++++ .../parent-old/pom.xml | 68 +++++++++++++ .../matchers/multi/parentold/Pojo1.java | 45 +++++++++ .../matchers/multi/parentold/Pojo2.java | 42 ++++++++ src/it/multimodule-nogeneric-it-jdk9+/pom.xml | 1 + .../common/AbstractRoundMirrorSupport.java | 5 - .../matchers/provideprocessor/Matchable.java | 17 +++- .../ProvideMatchersAnnotationMirror.java | 7 ++ .../ProvideMatchersMirror.java | 9 +- ...ersAnnotatedElementFieldMatcherMirror.java | 12 ++- ...rovidesMatchersAnnotatedElementMirror.java | 58 ++--------- .../provideprocessor/RoundMirror.java | 3 +- .../fields/CollectionFieldDescription.java | 8 +- .../fields/FieldDescriptionMetaData.java | 21 +++- .../fields/IgnoreFieldDescription.java | 2 +- .../fields/MapFieldDescription.java | 4 +- .../fields/OptionalFieldDescription.java | 19 ++-- .../ProvidesMatchersWithSameValueHelper.java | 97 +++++++++++++++++++ src/site/apt/link.apt | 2 +- ...desMatchersAnnotatedElementMirrorTest.java | 4 +- .../fields/DefaultFieldDescriptionTest.java | 21 +++- .../fields/IgnoreFieldDescriptionTest.java | 2 +- .../extensions/jackson/JacksonPojo.java | 12 --- .../jackson/JacksonPojoDisabled.java | 12 --- 34 files changed, 726 insertions(+), 108 deletions(-) create mode 100644 src/it/multimodule-nogeneric-it-jdk8/children/src/main/java/ch/powerunit/extensions/matchers/multi/children/Pojo24.java create mode 100644 src/it/multimodule-nogeneric-it-jdk8/children/src/main/java/ch/powerunit/extensions/matchers/multi/children/Pojo26.java create mode 100644 src/it/multimodule-nogeneric-it-jdk8/parent-old/pom.xml create mode 100644 src/it/multimodule-nogeneric-it-jdk8/parent-old/src/main/java/ch/powerunit/extensions/matchers/multi/parentold/Pojo1.java create mode 100644 src/it/multimodule-nogeneric-it-jdk8/parent-old/src/main/java/ch/powerunit/extensions/matchers/multi/parentold/Pojo2.java create mode 100644 src/it/multimodule-nogeneric-it-jdk9+/children/src/main/java/ch/powerunit/extensions/matchers/multi/children/Pojo24.java create mode 100644 src/it/multimodule-nogeneric-it-jdk9+/children/src/main/java/ch/powerunit/extensions/matchers/multi/children/Pojo26.java create mode 100644 src/it/multimodule-nogeneric-it-jdk9+/parent-old/pom.xml create mode 100644 src/it/multimodule-nogeneric-it-jdk9+/parent-old/src/main/java/ch/powerunit/extensions/matchers/multi/parentold/Pojo1.java create mode 100644 src/it/multimodule-nogeneric-it-jdk9+/parent-old/src/main/java/ch/powerunit/extensions/matchers/multi/parentold/Pojo2.java create mode 100644 src/main/java/ch/powerunit/extensions/matchers/provideprocessor/helper/ProvidesMatchersWithSameValueHelper.java delete mode 100644 src/test/java/ch/powerunit/extensions/matchers/samples/extensions/jackson/JacksonPojo.java delete mode 100644 src/test/java/ch/powerunit/extensions/matchers/samples/extensions/jackson/JacksonPojoDisabled.java diff --git a/pom.xml b/pom.xml index d367862e7..ecf731f4e 100644 --- a/pom.xml +++ b/pom.xml @@ -327,6 +327,7 @@ org.hamcrest:hamcrest:2.2:jar org.hamcrest:hamcrest:2.1:jar + ch.powerunit.extensions:powerunit-extensions-matchers:0.2.0:jar true ch.powerunit.extensions.matchers diff --git a/src/it/multimodule-nogeneric-it-jdk8/children/pom.xml b/src/it/multimodule-nogeneric-it-jdk8/children/pom.xml index 494834704..585edeb2f 100644 --- a/src/it/multimodule-nogeneric-it-jdk8/children/pom.xml +++ b/src/it/multimodule-nogeneric-it-jdk8/children/pom.xml @@ -69,5 +69,10 @@ powerunit-extensions-matchers-multimodule-parent-it1000 ${project.version} + + ch.powerunit.extensions + powerunit-extensions-matchers-multimodule-parent-old-it1000 + ${project.version} + \ No newline at end of file diff --git a/src/it/multimodule-nogeneric-it-jdk8/children/src/main/java/ch/powerunit/extensions/matchers/multi/children/Pojo24.java b/src/it/multimodule-nogeneric-it-jdk8/children/src/main/java/ch/powerunit/extensions/matchers/multi/children/Pojo24.java new file mode 100644 index 000000000..8fa4c8819 --- /dev/null +++ b/src/it/multimodule-nogeneric-it-jdk8/children/src/main/java/ch/powerunit/extensions/matchers/multi/children/Pojo24.java @@ -0,0 +1,51 @@ +/** + * Powerunit - A JDK1.8 test framework + * Copyright (C) 2014 Mathieu Boretti. + * + * This file is part of Powerunit + * + * Powerunit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Powerunit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Powerunit. If not, see . + */ +package ch.powerunit.extensions.matchers.multi.children; + +import ch.powerunit.extensions.matchers.ProvideMatchers; +import ch.powerunit.extensions.matchers.multi.parentold.Pojo1; + +/** + * @author borettim + * + */ +@ProvideMatchers +public class Pojo24 extends Pojo1 { + + public String msg2; + + public Pojo24() { + } + + public Pojo24(String msg2) { + this.msg2 = msg2; + } + + public Pojo24(String msg1, String msg2) { + super(msg1); + this.msg2 = msg2; + } + + @Override + public String toString() { + return "Pojo24 [msg2=" + msg2 + ", msg1=" + msg1 + "]"; + } + +} diff --git a/src/it/multimodule-nogeneric-it-jdk8/children/src/main/java/ch/powerunit/extensions/matchers/multi/children/Pojo26.java b/src/it/multimodule-nogeneric-it-jdk8/children/src/main/java/ch/powerunit/extensions/matchers/multi/children/Pojo26.java new file mode 100644 index 000000000..b35b7d79d --- /dev/null +++ b/src/it/multimodule-nogeneric-it-jdk8/children/src/main/java/ch/powerunit/extensions/matchers/multi/children/Pojo26.java @@ -0,0 +1,47 @@ +/** + * Powerunit - A JDK1.8 test framework + * Copyright (C) 2014 Mathieu Boretti. + * + * This file is part of Powerunit + * + * Powerunit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Powerunit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Powerunit. If not, see . + */ +package ch.powerunit.extensions.matchers.multi.children; + +import ch.powerunit.extensions.matchers.ProvideMatchers; +import ch.powerunit.extensions.matchers.multi.parentold.Pojo1; + +/** + * @author borettim + * + */ +@ProvideMatchers +public class Pojo26 { + + public Pojo1 field1; + + public Pojo26() { + } + + public Pojo26(Pojo1 field1) { + super(); + this.field1 = field1; + } + + @Override + public String toString() { + return "Pojo26 [field1=" + field1 + "]"; + } + +} diff --git a/src/it/multimodule-nogeneric-it-jdk8/parent-old/pom.xml b/src/it/multimodule-nogeneric-it-jdk8/parent-old/pom.xml new file mode 100644 index 000000000..4816c1994 --- /dev/null +++ b/src/it/multimodule-nogeneric-it-jdk8/parent-old/pom.xml @@ -0,0 +1,68 @@ + + 4.0.0 + ch.powerunit.extensions + powerunit-extensions-matchers-multimodule-parent-old-it1000 + + + ch.powerunit.extensions + powerunit-extensions-matchers-multimodule-master-it1000 + @project.version@ + ../pom.xml + + + jar + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + + jar + + + + + true + false + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.source.version} + ${java.target.version} + true + + -J@testcompileargs@ + + + + + + + + + org.hamcrest + hamcrest-all + ${hamcrest.version} + + + ch.powerunit + powerunit + ${powerunit.version} + test + + + ch.powerunit.extensions + powerunit-extensions-matchers + 0.2.0 + + + \ No newline at end of file diff --git a/src/it/multimodule-nogeneric-it-jdk8/parent-old/src/main/java/ch/powerunit/extensions/matchers/multi/parentold/Pojo1.java b/src/it/multimodule-nogeneric-it-jdk8/parent-old/src/main/java/ch/powerunit/extensions/matchers/multi/parentold/Pojo1.java new file mode 100644 index 000000000..2b8387c6b --- /dev/null +++ b/src/it/multimodule-nogeneric-it-jdk8/parent-old/src/main/java/ch/powerunit/extensions/matchers/multi/parentold/Pojo1.java @@ -0,0 +1,45 @@ +/** + * Powerunit - A JDK1.8 test framework + * Copyright (C) 2014 Mathieu Boretti. + * + * This file is part of Powerunit + * + * Powerunit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Powerunit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Powerunit. If not, see . + */ +package ch.powerunit.extensions.matchers.multi.parentold; + +import ch.powerunit.extensions.matchers.ProvideMatchers; + +/** + * @author borettim + * + */ +@ProvideMatchers +public class Pojo1 { + + public String msg1; + + public Pojo1() { + } + + public Pojo1(String msg1) { + this.msg1 = msg1; + } + + @Override + public String toString() { + return "Pojo1 [msg1=" + msg1 + "]"; + } + +} diff --git a/src/it/multimodule-nogeneric-it-jdk8/parent-old/src/main/java/ch/powerunit/extensions/matchers/multi/parentold/Pojo2.java b/src/it/multimodule-nogeneric-it-jdk8/parent-old/src/main/java/ch/powerunit/extensions/matchers/multi/parentold/Pojo2.java new file mode 100644 index 000000000..3d3360115 --- /dev/null +++ b/src/it/multimodule-nogeneric-it-jdk8/parent-old/src/main/java/ch/powerunit/extensions/matchers/multi/parentold/Pojo2.java @@ -0,0 +1,42 @@ +/** + * Powerunit - A JDK1.8 test framework + * Copyright (C) 2014 Mathieu Boretti. + * + * This file is part of Powerunit + * + * Powerunit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Powerunit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Powerunit. If not, see . + */ +package ch.powerunit.extensions.matchers.multi.parentold; + +/** + * @author borettim + * + */ +public class Pojo2 { + + public String msg1; + + public Pojo2() { + } + + public Pojo2(String msg1) { + this.msg1 = msg1; + } + + @Override + public String toString() { + return "Pojo2 [msg1=" + msg1 + "]"; + } + +} diff --git a/src/it/multimodule-nogeneric-it-jdk8/pom.xml b/src/it/multimodule-nogeneric-it-jdk8/pom.xml index f54929790..dc6beef5c 100644 --- a/src/it/multimodule-nogeneric-it-jdk8/pom.xml +++ b/src/it/multimodule-nogeneric-it-jdk8/pom.xml @@ -162,6 +162,7 @@ parent + parent-old children diff --git a/src/it/multimodule-nogeneric-it-jdk9+/children/pom.xml b/src/it/multimodule-nogeneric-it-jdk9+/children/pom.xml index 69112d8b0..d78a1ac28 100644 --- a/src/it/multimodule-nogeneric-it-jdk9+/children/pom.xml +++ b/src/it/multimodule-nogeneric-it-jdk9+/children/pom.xml @@ -69,6 +69,11 @@ powerunit-extensions-matchers-multimodule-parent-it1000 ${project.version} + + ch.powerunit.extensions + powerunit-extensions-matchers-multimodule-parent-old-it1000 + ${project.version} + javax.annotation javax.annotation-api diff --git a/src/it/multimodule-nogeneric-it-jdk9+/children/src/main/java/ch/powerunit/extensions/matchers/multi/children/Pojo24.java b/src/it/multimodule-nogeneric-it-jdk9+/children/src/main/java/ch/powerunit/extensions/matchers/multi/children/Pojo24.java new file mode 100644 index 000000000..8fa4c8819 --- /dev/null +++ b/src/it/multimodule-nogeneric-it-jdk9+/children/src/main/java/ch/powerunit/extensions/matchers/multi/children/Pojo24.java @@ -0,0 +1,51 @@ +/** + * Powerunit - A JDK1.8 test framework + * Copyright (C) 2014 Mathieu Boretti. + * + * This file is part of Powerunit + * + * Powerunit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Powerunit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Powerunit. If not, see . + */ +package ch.powerunit.extensions.matchers.multi.children; + +import ch.powerunit.extensions.matchers.ProvideMatchers; +import ch.powerunit.extensions.matchers.multi.parentold.Pojo1; + +/** + * @author borettim + * + */ +@ProvideMatchers +public class Pojo24 extends Pojo1 { + + public String msg2; + + public Pojo24() { + } + + public Pojo24(String msg2) { + this.msg2 = msg2; + } + + public Pojo24(String msg1, String msg2) { + super(msg1); + this.msg2 = msg2; + } + + @Override + public String toString() { + return "Pojo24 [msg2=" + msg2 + ", msg1=" + msg1 + "]"; + } + +} diff --git a/src/it/multimodule-nogeneric-it-jdk9+/children/src/main/java/ch/powerunit/extensions/matchers/multi/children/Pojo26.java b/src/it/multimodule-nogeneric-it-jdk9+/children/src/main/java/ch/powerunit/extensions/matchers/multi/children/Pojo26.java new file mode 100644 index 000000000..b35b7d79d --- /dev/null +++ b/src/it/multimodule-nogeneric-it-jdk9+/children/src/main/java/ch/powerunit/extensions/matchers/multi/children/Pojo26.java @@ -0,0 +1,47 @@ +/** + * Powerunit - A JDK1.8 test framework + * Copyright (C) 2014 Mathieu Boretti. + * + * This file is part of Powerunit + * + * Powerunit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Powerunit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Powerunit. If not, see . + */ +package ch.powerunit.extensions.matchers.multi.children; + +import ch.powerunit.extensions.matchers.ProvideMatchers; +import ch.powerunit.extensions.matchers.multi.parentold.Pojo1; + +/** + * @author borettim + * + */ +@ProvideMatchers +public class Pojo26 { + + public Pojo1 field1; + + public Pojo26() { + } + + public Pojo26(Pojo1 field1) { + super(); + this.field1 = field1; + } + + @Override + public String toString() { + return "Pojo26 [field1=" + field1 + "]"; + } + +} diff --git a/src/it/multimodule-nogeneric-it-jdk9+/parent-old/pom.xml b/src/it/multimodule-nogeneric-it-jdk9+/parent-old/pom.xml new file mode 100644 index 000000000..4816c1994 --- /dev/null +++ b/src/it/multimodule-nogeneric-it-jdk9+/parent-old/pom.xml @@ -0,0 +1,68 @@ + + 4.0.0 + ch.powerunit.extensions + powerunit-extensions-matchers-multimodule-parent-old-it1000 + + + ch.powerunit.extensions + powerunit-extensions-matchers-multimodule-master-it1000 + @project.version@ + ../pom.xml + + + jar + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + + jar + + + + + true + false + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.source.version} + ${java.target.version} + true + + -J@testcompileargs@ + + + + + + + + + org.hamcrest + hamcrest-all + ${hamcrest.version} + + + ch.powerunit + powerunit + ${powerunit.version} + test + + + ch.powerunit.extensions + powerunit-extensions-matchers + 0.2.0 + + + \ No newline at end of file diff --git a/src/it/multimodule-nogeneric-it-jdk9+/parent-old/src/main/java/ch/powerunit/extensions/matchers/multi/parentold/Pojo1.java b/src/it/multimodule-nogeneric-it-jdk9+/parent-old/src/main/java/ch/powerunit/extensions/matchers/multi/parentold/Pojo1.java new file mode 100644 index 000000000..2b8387c6b --- /dev/null +++ b/src/it/multimodule-nogeneric-it-jdk9+/parent-old/src/main/java/ch/powerunit/extensions/matchers/multi/parentold/Pojo1.java @@ -0,0 +1,45 @@ +/** + * Powerunit - A JDK1.8 test framework + * Copyright (C) 2014 Mathieu Boretti. + * + * This file is part of Powerunit + * + * Powerunit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Powerunit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Powerunit. If not, see . + */ +package ch.powerunit.extensions.matchers.multi.parentold; + +import ch.powerunit.extensions.matchers.ProvideMatchers; + +/** + * @author borettim + * + */ +@ProvideMatchers +public class Pojo1 { + + public String msg1; + + public Pojo1() { + } + + public Pojo1(String msg1) { + this.msg1 = msg1; + } + + @Override + public String toString() { + return "Pojo1 [msg1=" + msg1 + "]"; + } + +} diff --git a/src/it/multimodule-nogeneric-it-jdk9+/parent-old/src/main/java/ch/powerunit/extensions/matchers/multi/parentold/Pojo2.java b/src/it/multimodule-nogeneric-it-jdk9+/parent-old/src/main/java/ch/powerunit/extensions/matchers/multi/parentold/Pojo2.java new file mode 100644 index 000000000..3d3360115 --- /dev/null +++ b/src/it/multimodule-nogeneric-it-jdk9+/parent-old/src/main/java/ch/powerunit/extensions/matchers/multi/parentold/Pojo2.java @@ -0,0 +1,42 @@ +/** + * Powerunit - A JDK1.8 test framework + * Copyright (C) 2014 Mathieu Boretti. + * + * This file is part of Powerunit + * + * Powerunit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Powerunit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Powerunit. If not, see . + */ +package ch.powerunit.extensions.matchers.multi.parentold; + +/** + * @author borettim + * + */ +public class Pojo2 { + + public String msg1; + + public Pojo2() { + } + + public Pojo2(String msg1) { + this.msg1 = msg1; + } + + @Override + public String toString() { + return "Pojo2 [msg1=" + msg1 + "]"; + } + +} diff --git a/src/it/multimodule-nogeneric-it-jdk9+/pom.xml b/src/it/multimodule-nogeneric-it-jdk9+/pom.xml index f54929790..dc6beef5c 100644 --- a/src/it/multimodule-nogeneric-it-jdk9+/pom.xml +++ b/src/it/multimodule-nogeneric-it-jdk9+/pom.xml @@ -162,6 +162,7 @@ parent + parent-old children diff --git a/src/main/java/ch/powerunit/extensions/matchers/common/AbstractRoundMirrorSupport.java b/src/main/java/ch/powerunit/extensions/matchers/common/AbstractRoundMirrorSupport.java index 6ba55d010..937788f55 100644 --- a/src/main/java/ch/powerunit/extensions/matchers/common/AbstractRoundMirrorSupport.java +++ b/src/main/java/ch/powerunit/extensions/matchers/common/AbstractRoundMirrorSupport.java @@ -62,9 +62,4 @@ default String getAnnotationProcessorVersion() { return getClass().getPackage().getImplementationVersion(); } - default long getCompatibility() { - // No specify bit for the moment - return 0L; - } - } diff --git a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/Matchable.java b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/Matchable.java index f07a15266..383f271c5 100644 --- a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/Matchable.java +++ b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/Matchable.java @@ -28,6 +28,11 @@ public interface Matchable { String getSimpleNameOfGeneratedInterfaceMatcher(); + default long getCompatibility() { + // 0x01 : withSameValue also provides a version to ignore fields + return 0x01; + } + default String getMethodNameDSLWithSameValue() { return getMethodShortClassName() + "WithSameValue"; } @@ -40,7 +45,12 @@ default String getWithSameValue(boolean hasReference) { return getFullyQualifiedNameOfGeneratedClass() + (hasReference ? "::" : ".") + getMethodNameDSLWithSameValue(); } - static Matchable of(String fullName, String methodName, String interfaceName, boolean hasWithSameValue) { + default boolean supportIgnore() { + return (getCompatibility() & 0x01) == 0x01; + } + + static Matchable of(String fullName, String methodName, String interfaceName, boolean hasWithSameValue, + long compatibility) { return new Matchable() { @Override @@ -62,6 +72,11 @@ public String getMethodShortClassName() { public String getFullyQualifiedNameOfGeneratedClass() { return fullName; } + + @Override + public long getCompatibility() { + return compatibility; + } }; } } diff --git a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/ProvideMatchersAnnotationMirror.java b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/ProvideMatchersAnnotationMirror.java index d6254443f..66e383589 100644 --- a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/ProvideMatchersAnnotationMirror.java +++ b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/ProvideMatchersAnnotationMirror.java @@ -60,4 +60,11 @@ public String[] extensions() { return realAnnotation.extensions(); } + /** + * @return the realAnnotation + */ + public ProvideMatchers getRealAnnotation() { + return realAnnotation; + } + } diff --git a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/ProvideMatchersMirror.java b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/ProvideMatchersMirror.java index 5b06fca2e..c3219006a 100644 --- a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/ProvideMatchersMirror.java +++ b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/ProvideMatchersMirror.java @@ -23,10 +23,12 @@ import static java.util.stream.Collectors.collectingAndThen; import static java.util.stream.Collectors.toList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Optional; import java.util.function.Function; +import java.util.stream.Collectors; import javax.lang.model.element.TypeElement; import javax.lang.model.util.Elements; @@ -102,7 +104,8 @@ private Function asJavadocFormat(String prefix) { } private String paramToJavadoc(Optional param) { - return param.map(asJavadocFormat(" * @param ")).orElse(""); + return param.map(p -> Arrays.stream(p.split("\n"))).map(s -> s.map(asJavadocFormat(" * @param "))) + .map(s -> s.collect(Collectors.joining())).orElse(""); } protected String generateJavaDocWithoutParamNeitherParent(String description, String moreDetails, @@ -116,8 +119,8 @@ protected String generateDefaultJavaDoc() { DEFAULT_PARAM_PARENT); } - protected String generateDefaultJavaDoc(Optional moreDetails, Optional param, - String returnDescription, boolean withParent) { + public String generateDefaultJavaDoc(Optional moreDetails, Optional param, String returnDescription, + boolean withParent) { return String.format("/**\n * %1$s.\n%2$s%3$s%4$s * \n%5$s * @return %6$s\n */\n", getDefaultDescriptionForDsl(), moreDetails.map(asJavadocFormat(" *

\n * ")).orElse(""), paramToJavadoc(param), getParamComment(), withParent ? DEFAULT_PARAM_PARENT : "", returnDescription); diff --git a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/ProvidesMatchersAnnotatedElementFieldMatcherMirror.java b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/ProvidesMatchersAnnotatedElementFieldMatcherMirror.java index c70d061a6..4b7ac65cc 100644 --- a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/ProvidesMatchersAnnotatedElementFieldMatcherMirror.java +++ b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/ProvidesMatchersAnnotatedElementFieldMatcherMirror.java @@ -20,6 +20,7 @@ package ch.powerunit.extensions.matchers.provideprocessor; import static ch.powerunit.extensions.matchers.common.CommonUtils.addPrefix; +import static java.util.Collections.unmodifiableList; import static java.util.stream.Collectors.collectingAndThen; import static java.util.stream.Collectors.groupingBy; import static java.util.stream.Collectors.joining; @@ -69,7 +70,7 @@ private List generateFields(TypeElement typeElement, public ProvidesMatchersAnnotatedElementFieldMatcherMirror(TypeElement typeElement, RoundMirror roundMirror) { super(typeElement, roundMirror); - this.fields = generateFields(typeElement, new ProvidesMatchersSubElementVisitor(roundMirror)); + this.fields = unmodifiableList(generateFields(typeElement, new ProvidesMatchersSubElementVisitor(roundMirror))); this.fieldsMatcher = fields.stream().map(FieldDescriptionMetaData::getMatcherForField) .map(f -> addPrefix(" ", f)).collect(joining("\n")) + "\n"; } @@ -86,6 +87,13 @@ public String generateParentMatcher(String parent) { fullGeneric, getFullyQualifiedNameOfClassAnnotated(), parent); } + /** + * @return the fields + */ + public List getFields() { + return fields; + } + public String generateMetadata() { // @formatter:off return "\n\n" @@ -99,7 +107,7 @@ public String generateMetadata() { + " public static final class Metadata {\n\n" + " private Metadata() {}\n\n" + " public final String ANNOTATION_PROCESSOR_VERSION = \"" + getAnnotationProcessorVersion() + "\";\n\n" - + " public final long COMPATIBILITY = " + getCompatibility() + ";\n\n" + + " public final long COMPATIBILITY = " + getCompatibility() + "L;\n\n" + " public final String SOURCE_CLASS_NAME = \"" + getFullyQualifiedNameOfClassAnnotatedWithProvideMatcherWithGeneric() + "\";\n\n" + " public final Class<"+getFullyQualifiedNameOfClassAnnotated()+"> SOURCE_CLASS = " + getFullyQualifiedNameOfClassAnnotated() + ".class;\n\n" + " public final String SOURCE_PARENT_CLASS_NAME = " + fullyQualifiedNameOfSuperClassOfClassAnnotated.map(CommonUtils::toJavaSyntax).orElse("null") + ";\n\n" diff --git a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/ProvidesMatchersAnnotatedElementMirror.java b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/ProvidesMatchersAnnotatedElementMirror.java index 168c803be..ceed29099 100644 --- a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/ProvidesMatchersAnnotatedElementMirror.java +++ b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/ProvidesMatchersAnnotatedElementMirror.java @@ -25,6 +25,8 @@ import static ch.powerunit.extensions.matchers.common.FileObjectHelper.processFileWithIOExceptionAndResult; import static ch.powerunit.extensions.matchers.provideprocessor.dsl.DSLMethod.of; import static java.util.Collections.unmodifiableList; +import static java.util.Optional.empty; +import static java.util.Optional.ofNullable; import static java.util.stream.Collectors.toList; import java.io.PrintWriter; @@ -33,18 +35,15 @@ import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.Map.Entry; import java.util.Objects; import java.util.Optional; import java.util.function.Supplier; -import javax.lang.model.element.AnnotationMirror; -import javax.lang.model.element.AnnotationValue; import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; -import javax.tools.Diagnostic.Kind; import ch.powerunit.extensions.matchers.provideprocessor.dsl.DSLMethod; +import ch.powerunit.extensions.matchers.provideprocessor.helper.ProvidesMatchersWithSameValueHelper; public class ProvidesMatchersAnnotatedElementMirror extends ProvidesMatchersAnnotatedElementMatcherMirror { @@ -56,15 +55,15 @@ public ProvidesMatchersAnnotatedElementMirror(TypeElement typeElement, RoundMirr Arrays.asList(this::generateDefaultDSLStarter, this::generateDefaultForChainingDSLStarter)); if (hasSuperClass()) { tmp.add(this::generateParentDSLStarter); - tmp.add(this::generateParentValueDSLStarter); + tmp.addAll(ProvidesMatchersWithSameValueHelper.generateParentValueDSLStarter(this, true)); if (((TypeElement) roundMirror.getTypeUtils().asElement(element.getSuperclass())).getTypeParameters() .isEmpty()) { tmp.add(this::generateParentInSameRoundWithChaningDSLStarter); } } else { - tmp.add(() -> generatParentValueDSLStarter("")); + tmp.addAll(ProvidesMatchersWithSameValueHelper.generateParentValueDSLStarter(this, false)); } - tmp.addAll(Optional.ofNullable(getDSLExtension()).orElseGet(Collections::emptyList).stream() + tmp.addAll(ofNullable(getDSLExtension()).orElseGet(Collections::emptyList).stream() .map(t -> t.getDSLMethodFor(() -> this)).flatMap(Collection::stream).collect(toList())); tmp.addAll(roundMirror.getDSLMethodFor(() -> this)); this.dslProvider = unmodifiableList(tmp); @@ -120,17 +119,17 @@ public String generateDefaultJavaDocWithDSLStarter(Optional param, Strin public String generateDefaultJavaDocWithoutDSLStarter(Optional param, String returnDescription, boolean withParent) { - return generateDefaultJavaDoc(Optional.empty(), param, returnDescription, withParent); + return generateDefaultJavaDoc(empty(), param, returnDescription, withParent); } public DSLMethod generateDefaultDSLStarter() { return of(fullGeneric + " " + getFullyQualifiedNameOfGeneratedClass() + "." + getSimpleNameOfGeneratedInterfaceMatcherWithGenericNoParent() + " " + methodShortClassName + "With") .withImplementation(getDefaultStarterBody(false)) - .withJavadoc(generateDefaultJavaDocWithDSLStarter(Optional.empty(), "the DSL matcher", false)); + .withJavadoc(generateDefaultJavaDocWithDSLStarter(empty(), "the DSL matcher", false)); } - private String getJavadocForDSLStarter() { + public String getJavadocForDSLStarter() { return "The returned builder (which is also a Matcher), at this point accepts any object that is a " + getDefaultLinkForAnnotatedClass() + "."; } @@ -158,42 +157,6 @@ public DSLMethod generateParentDSLStarter() { false)); } - public DSLMethod generatParentValueDSLStarter(String argumentForParentBuilder) { - String genericNoParent = getSimpleNameOfGeneratedInterfaceMatcherWithGenericNoParent(); - String javadoc = generateDefaultJavaDocWithoutDSLStarter( - Optional.of("other the other object to be used as a reference."), "the DSL matcher", false); - List lines = new ArrayList<>(); - lines.add(genericNoParent + " m=new " + getSimpleNameOfGeneratedImplementationMatcherWithGenericNoParent() + "(" - + argumentForParentBuilder + ");"); - lines.addAll(fields.stream().map(f -> f.getFieldCopy("m", "other") + ";").collect(toList())); - lines.add("return m;"); - return of(fullGeneric + " " + getFullyQualifiedNameOfGeneratedClass() + "." + genericNoParent + " " - + getMethodNameDSLWithSameValue()) - .withOneArgument(getFullyQualifiedNameOfClassAnnotatedWithProvideMatcherWithGeneric(), "other") - .withImplementation(lines).withJavadoc(javadoc); - } - - public DSLMethod generateParentValueDSLStarterWeak() { - if (realAnnotation.allowWeakWithSameValue()) { - Optional am = getAnnotationMirror(); - Optional av = am.map(a -> a.getElementValues().entrySet().stream() - .filter(kv -> kv.getKey().getSimpleName().toString().equals("allowWeakWithSameValue")) - .map(Entry::getValue).findAny().orElse(null)); - getMessager().printMessage(Kind.MANDATORY_WARNING, - "This class use the option allowWeakWithSameValue and a weak WithSameValue is detected. The generated WithSameValue DSL may not be able to fully control all the field of this class", - element, am.orElse(null), av.orElse(null)); - - return generatParentValueDSLStarter("org.hamcrest.Matchers.anything()"); - } - return null; - } - - public DSLMethod generateParentValueDSLStarter() { - return getParentMirror() - .map(parentMirror -> generatParentValueDSLStarter(parentMirror.getWithSameValue(false) + "(other)")) - .orElse(generateParentValueDSLStarterWeak()); - } - public DSLMethod generateParentInSameRoundWithChaningDSLStarter() { String implGenericNoParent = getSimpleNameOfGeneratedImplementationMatcherWithGenericNoParent(); return getParentMirror().map(parentMirror -> { @@ -207,8 +170,7 @@ public DSLMethod generateParentInSameRoundWithChaningDSLStarter() { pmfqngc + "." + parentSimpleName + " tmp = " + pmfqngc + "." + parentMirror.getMethodNameDSLWithParent() + "(m);", "m._parent = new SuperClassMatcher(tmp);", "return tmp;") - .withJavadoc(generateDefaultJavaDoc(Optional.empty(), Optional.empty(), "the DSL matcher", - false)); + .withJavadoc(generateDefaultJavaDoc(empty(), empty(), "the DSL matcher", false)); }).orElse(null); } diff --git a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/RoundMirror.java b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/RoundMirror.java index a2bdd9701..0a1f90847 100644 --- a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/RoundMirror.java +++ b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/RoundMirror.java @@ -157,7 +157,8 @@ private Matchable lookupMatchableByTypeAndMatchers(TypeElement type, TypeElement String withSameValue = shortMethodClassName + "WithSameValue"; boolean hasSameValue = methodsIn(guestMatcherEnclosed).stream().filter(t -> isSimpleName(t, withSameValue)) .anyMatch(this::isStatic); - return Matchable.of(getQualifiedName(guestMatcher), shortMethodClassName, guestMatcherName, hasSameValue); + return Matchable.of(getQualifiedName(guestMatcher), shortMethodClassName, guestMatcherName, hasSameValue, + compatibilityField.get()); } public AnnotationMirror getProvideMatchersAnnotation(Element e) { diff --git a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/fields/CollectionFieldDescription.java b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/fields/CollectionFieldDescription.java index 89510d800..2a5a61a5c 100644 --- a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/fields/CollectionFieldDescription.java +++ b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/fields/CollectionFieldDescription.java @@ -85,14 +85,14 @@ public List getDslForIterableWithGeneric() { } @Override - public String getFieldCopy(String lhs, String rhs) { + protected String getFieldCopy(String lhs, String rhs, String paramForHasSameValue) { if (!"".equals(generic)) { return getFieldCopyForList(lhs, rhs); } - return super.getFieldCopy(lhs, rhs); + return super.getFieldCopy(lhs, rhs, paramForHasSameValue); } - public String getFieldCopyForList(String lhs, String rhs) { + protected String getFieldCopyForList(String lhs, String rhs) { String fieldAccessor = getFieldAccessor(); String fieldName = getFieldName(); return "if(" + rhs + "." + fieldAccessor + "==null) {" + lhs + "." + fieldName + "(" + MATCHERS @@ -102,7 +102,7 @@ public String getFieldCopyForList(String lhs, String rhs) { + ").collect(java.util.stream.Collectors.toList())); }"; } - public String generateMatcherBuilderReferenceFor(String generic) { + protected String generateMatcherBuilderReferenceFor(String generic) { return ofNullable(getByName(generic)).filter(Matchable::hasWithSameValue).map(t -> t.getWithSameValue(true)) .orElse(MATCHERS + "::is"); } diff --git a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/fields/FieldDescriptionMetaData.java b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/fields/FieldDescriptionMetaData.java index a35246ae2..72adb0298 100644 --- a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/fields/FieldDescriptionMetaData.java +++ b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/fields/FieldDescriptionMetaData.java @@ -22,6 +22,8 @@ import static ch.powerunit.extensions.matchers.common.CommonUtils.toJavaSyntax; import static java.util.stream.Collectors.joining; +import java.util.Optional; + import javax.lang.model.element.Element; import javax.lang.model.type.DeclaredType; import javax.lang.model.type.TypeMirror; @@ -74,16 +76,27 @@ public String getFieldCopyDefault(String lhs, String rhs) { return generateBaseFieldCopy(lhs, String.format(IS_MATCHER, rhs, getFieldAccessor())); } - public String getFieldCopySameRound(String lhs, String rhs, Matchable target) { + public String getFieldCopySameRound(String lhs, String rhs, Matchable target, String paramForHasSameValue) { String fieldAccessor = getFieldAccessor(); return generateBaseFieldCopy(lhs, rhs + "." + fieldAccessor + "==null?" + MATCHERS + ".nullValue():" - + target.getWithSameValue(false) + "(" + rhs + "." + fieldAccessor + ")"); + + target.getWithSameValue(false) + "(" + rhs + "." + fieldAccessor + (target.supportIgnore()?paramForHasSameValue:"") + ")"); + } + + public String getFieldCopy(String lhs, String rhs, Optional ignored) { + return ignored + .map(i -> "if (!java.util.Arrays.asList(" + i + ").contains(\"" + getFieldName() + "\")) {" + + getFieldCopy(lhs, rhs, + ",java.util.Arrays.stream(" + i + ").filter(s->s.startsWith(\"" + getFieldName() + + ".\")).map(s->s.replaceFirst(\"" + getFieldName() + + "\\\\.\",\"\")).toArray(String[]::new)") + + ";}") + .orElseGet(() -> getFieldCopy(lhs, rhs, "")); } - public String getFieldCopy(String lhs, String rhs) { + protected String getFieldCopy(String lhs, String rhs, String paramForHasSameValue) { return mirror.getMatchable(containingElementMirror.getRoundMirror()) .filter(a -> mirror.getFieldTypeAsTypeElement().getTypeParameters().isEmpty()) - .filter(Matchable::hasWithSameValue).map(p -> getFieldCopySameRound(lhs, rhs, p)) + .filter(Matchable::hasWithSameValue).map(p -> getFieldCopySameRound(lhs, rhs, p, paramForHasSameValue)) .orElse(getFieldCopyDefault(lhs, rhs)); } diff --git a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/fields/IgnoreFieldDescription.java b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/fields/IgnoreFieldDescription.java index ebbf7b5ef..06fd3cc7f 100644 --- a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/fields/IgnoreFieldDescription.java +++ b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/fields/IgnoreFieldDescription.java @@ -57,7 +57,7 @@ public String asMatcherField() { } @Override - public String getFieldCopy(String lhs, String rhs) { + protected String getFieldCopy(String lhs, String rhs,String paramForHasSameValue) { return "/* ignored - " + getFieldName() + " */"; } diff --git a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/fields/MapFieldDescription.java b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/fields/MapFieldDescription.java index f96a7f6f5..0faa6e12e 100644 --- a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/fields/MapFieldDescription.java +++ b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/fields/MapFieldDescription.java @@ -86,7 +86,7 @@ public String getMatcherForField() { } @Override - public String getFieldCopy(String lhs, String rhs) { + protected String getFieldCopy(String lhs, String rhs, String paramForHasSameValue) { if (!"".equals(generic)) { String fieldAccessor = getFieldAccessor(); String fieldName = getFieldName(); @@ -94,7 +94,7 @@ public String getFieldCopy(String lhs, String rhs) { + ".nullValue()); } else {" + lhs + "." + fieldName + "HasSameValues(" + rhs + "." + fieldAccessor + ");}"; } - return super.getFieldCopy(lhs, rhs); + return super.getFieldCopy(lhs, rhs, paramForHasSameValue); } diff --git a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/fields/OptionalFieldDescription.java b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/fields/OptionalFieldDescription.java index b7dca5278..0b0a052ed 100644 --- a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/fields/OptionalFieldDescription.java +++ b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/fields/OptionalFieldDescription.java @@ -79,25 +79,28 @@ private Collection getAbsentDSL() { } @Override - public String getFieldCopy(String lhs, String rhs) { + protected String getFieldCopy(String lhs, String rhs, String paramForHasSameValue) { if (!"".equals(generic)) { - return getFieldCopyForList(lhs, rhs); + return getFieldCopyForOptional(lhs, rhs, paramForHasSameValue); } - return super.getFieldCopy(lhs, rhs); + return super.getFieldCopy(lhs, rhs, paramForHasSameValue); } - public String getFieldCopyForList(String lhs, String rhs) { + public String getFieldCopyForOptional(String lhs, String rhs, String paramForHasSameValue) { String fieldAccessor = getFieldAccessor(); String fieldName = getFieldName(); return "if(" + rhs + "." + fieldAccessor + "==null) {" + lhs + "." + fieldName + "(" + MATCHERS + ".nullValue()); } else if (!" + rhs + "." + fieldAccessor + ".isPresent()) {" + lhs + "." + fieldName + "IsAbsent(); } else {" + lhs + "." + fieldName + "IsPresentAndIs(" - + generateMatcherBuilderReferenceFor(generic, rhs + "." + fieldAccessor + ".get()") + "); }"; + + generateMatcherBuilderReferenceFor(generic, rhs + "." + fieldAccessor + ".get()", + paramForHasSameValue) + + "); }"; } - public String generateMatcherBuilderReferenceFor(String generic, String accessor) { - return ofNullable(getByName(generic)).filter(Matchable::hasWithSameValue) - .map(t -> t.getWithSameValue(false) + "(" + accessor + ")").orElse(MATCHERS + ".is(" + accessor + ")"); + public String generateMatcherBuilderReferenceFor(String generic, String accessor, String paramForHasSameValue) { + return ofNullable(getByName(generic)).filter(Matchable::hasWithSameValue).map( + t -> t.getWithSameValue(false) + "(" + accessor + (t.supportIgnore() ? paramForHasSameValue : "") + ")") + .orElse(MATCHERS + ".is(" + accessor + ")"); } } diff --git a/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/helper/ProvidesMatchersWithSameValueHelper.java b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/helper/ProvidesMatchersWithSameValueHelper.java new file mode 100644 index 000000000..74bf27b8c --- /dev/null +++ b/src/main/java/ch/powerunit/extensions/matchers/provideprocessor/helper/ProvidesMatchersWithSameValueHelper.java @@ -0,0 +1,97 @@ +package ch.powerunit.extensions.matchers.provideprocessor.helper; + +import static ch.powerunit.extensions.matchers.provideprocessor.dsl.DSLMethod.of; +import static java.util.Arrays.asList; +import static java.util.Optional.empty; +import static java.util.stream.Collectors.toList; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.function.Supplier; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; +import javax.tools.Diagnostic.Kind; + +import ch.powerunit.extensions.matchers.provideprocessor.ProvidesMatchersAnnotatedElementMirror; +import ch.powerunit.extensions.matchers.provideprocessor.dsl.DSLMethod; + +public final class ProvidesMatchersWithSameValueHelper { + + private ProvidesMatchersWithSameValueHelper() { + } + + private static DSLMethod generateWithSameValueWithParentMatcherAndMayIgnore( + ProvidesMatchersAnnotatedElementMirror target, boolean hasSuper, boolean ignore) { + String genericNoParent = target.getSimpleNameOfGeneratedInterfaceMatcherWithGenericNoParent(); + String simpleNameGenericNoParent = target.getSimpleNameOfGeneratedImplementationMatcherWithGenericNoParent(); + String simpleNameGenericWithParent = target + .getFullyQualifiedNameOfClassAnnotatedWithProvideMatcherWithGeneric(); + String fullyQualified = target.getFullyQualifiedNameOfGeneratedClass(); + String withSameValueMethodName = target.getMethodNameDSLWithSameValue(); + String fullGeneric = target.getFullGeneric(); + String argumentForParentBuilder = hasSuper ? (target.getParentMirror().map( + p -> p.getWithSameValue(false) + "(other" + (p.supportIgnore() && ignore ? ",ignoredFields" : "") + ")") + .orElse("org.hamcrest.Matchers.anything()")) : ""; + String javadoc = target.generateDefaultJavaDocWithoutDSLStarter( + Optional.of("other the other object to be used as a reference." + + (ignore ? "\n ignoredFields fields name that must be ignored." : "")), + "the DSL matcher", false); + List lines = new ArrayList<>(); + lines.add(genericNoParent + " m=new " + simpleNameGenericNoParent + "(" + argumentForParentBuilder + ");"); + lines.addAll(target.getFields().stream() + .map(f -> f.getFieldCopy("m", "other", ignore ? Optional.of("ignoredFields") : empty()) + ";") + .collect(toList())); + lines.add("return m;"); + return of(fullGeneric + " " + fullyQualified + "." + genericNoParent + " " + withSameValueMethodName) + .withArguments(ignore + ? new String[][] { { simpleNameGenericWithParent, "other" }, { "String...", "ignoredFields" } } + : new String[][] { { simpleNameGenericWithParent, "other" } }) + .withImplementation(lines).withJavadoc(javadoc); + } + + public static boolean isWeakAllowed(ProvidesMatchersAnnotatedElementMirror target) { + if (target.getRealAnnotation().allowWeakWithSameValue()) { + Optional am = target.getAnnotationMirror(); + Optional av = am.map(a -> a.getElementValues().entrySet().stream() + .filter(kv -> kv.getKey().getSimpleName().toString().equals("allowWeakWithSameValue")) + .map(Entry::getValue).findAny().orElse(null)); + target.getMessager().printMessage(Kind.MANDATORY_WARNING, + "This class use the option allowWeakWithSameValue and a weak WithSameValue is detected. The generated WithSameValue DSL may not be able to fully control all the field of this class", + target.getElement(), am.orElse(null), av.orElse(null)); + return true; + } + return false; + } + + public static Collection> generateParentValueDSLStarter( + ProvidesMatchersAnnotatedElementMirror target, boolean hasSuper) { + if (hasSuper) { + return Arrays.asList(() -> target.getParentMirror() + .map(parentMirror -> generateWithSameValueWithParentMatcherAndMayIgnore(target, true, true)) + .orElseGet(() -> { + if (isWeakAllowed(target)) { + return generateWithSameValueWithParentMatcherAndMayIgnore(target, true, true); + } else { + return null; + } + }), + () -> target.getParentMirror().map( + parentMirror -> generateWithSameValueWithParentMatcherAndMayIgnore(target, true, false)) + .orElseGet(() -> { + if (isWeakAllowed(target)) { + return generateWithSameValueWithParentMatcherAndMayIgnore(target, true, false); + } else { + return null; + } + })); + } + return asList(() -> generateWithSameValueWithParentMatcherAndMayIgnore(target, false, false), + () -> generateWithSameValueWithParentMatcherAndMayIgnore(target, false, true)); + } + +} diff --git a/src/site/apt/link.apt b/src/site/apt/link.apt index 91757bc58..71a803f26 100644 --- a/src/site/apt/link.apt +++ b/src/site/apt/link.apt @@ -20,7 +20,7 @@ Detection of Matcher for Class [] - Now, we have a second maven project, which uses the first one as dependency, with have the following annotated classes : + Now, we have a second maven project, which uses the first one as dependency, we have the following annotated classes : * <<>> which extends <<>> diff --git a/src/test/java/ch/powerunit/extensions/matchers/provideprocessor/ProvidesMatchersAnnotatedElementMirrorTest.java b/src/test/java/ch/powerunit/extensions/matchers/provideprocessor/ProvidesMatchersAnnotatedElementMirrorTest.java index 980529f69..1de44debd 100644 --- a/src/test/java/ch/powerunit/extensions/matchers/provideprocessor/ProvidesMatchersAnnotatedElementMirrorTest.java +++ b/src/test/java/ch/powerunit/extensions/matchers/provideprocessor/ProvidesMatchersAnnotatedElementMirrorTest.java @@ -105,9 +105,9 @@ public void testGenerateDSLStarter() { ProvidesMatchersAnnotatedElementMirror underTest = new ProvidesMatchersAnnotatedElementMirror(typeElement, roundMirror); Collection results = underTest.generateDSLStarter(); - assertThat(results).is(iterableWithSize(3)); + assertThat(results).is(iterableWithSize(4)); assertThat(results.stream().map(x -> x.asStaticImplementation()).collect(Collectors.joining("\n"))).is( - "/**\n * Start a DSL matcher for the {@link fqn.Sn Sn}.\n *

\n * The returned builder (which is also a Matcher), at this point accepts any object that is a {@link fqn.Sn Sn}.\n * \n * \n * @return the DSL matcher\n */\npublic static fqn.SnMatchers.SnMatcher snWith() {\n return new SnMatcherImpl();\n}\n\n/**\n * Start a DSL matcher for the {@link fqn.Sn Sn}.\n *

\n * The returned builder (which is also a Matcher), at this point accepts any object that is a {@link fqn.Sn Sn}.\n * @param parentBuilder the parentBuilder.\n * \n * \n * @param <_PARENT> used to reference, if necessary, a parent for this builder. By default Void is used an indicate no parent builder.\n * @return the DSL matcher\n */\npublic static <_PARENT> fqn.SnMatchers.SnMatcher <_PARENT> snWithParent(_PARENT parentBuilder) {\n return new SnMatcherImpl<_PARENT>(parentBuilder);\n}\n\n/**\n * Start a DSL matcher for the {@link fqn.Sn Sn}.\n * @param other the other object to be used as a reference.\n * \n * \n * @return the DSL matcher\n */\npublic static fqn.SnMatchers.SnMatcher snWithSameValue(fqn.Sn other) {\n SnMatcher m=new SnMatcherImpl();\n return m;\n}\n"); + "/**\n * Start a DSL matcher for the {@link fqn.Sn Sn}.\n *

\n * The returned builder (which is also a Matcher), at this point accepts any object that is a {@link fqn.Sn Sn}.\n * \n * \n * @return the DSL matcher\n */\npublic static fqn.SnMatchers.SnMatcher snWith() {\n return new SnMatcherImpl();\n}\n\n/**\n * Start a DSL matcher for the {@link fqn.Sn Sn}.\n *

\n * The returned builder (which is also a Matcher), at this point accepts any object that is a {@link fqn.Sn Sn}.\n * @param parentBuilder the parentBuilder.\n * \n * \n * @param <_PARENT> used to reference, if necessary, a parent for this builder. By default Void is used an indicate no parent builder.\n * @return the DSL matcher\n */\npublic static <_PARENT> fqn.SnMatchers.SnMatcher <_PARENT> snWithParent(_PARENT parentBuilder) {\n return new SnMatcherImpl<_PARENT>(parentBuilder);\n}\n\n/**\n * Start a DSL matcher for the {@link fqn.Sn Sn}.\n * @param other the other object to be used as a reference.\n * \n * \n * @return the DSL matcher\n */\npublic static fqn.SnMatchers.SnMatcher snWithSameValue(fqn.Sn other) {\n SnMatcher m=new SnMatcherImpl();\n return m;\n}\n\n/**\n * Start a DSL matcher for the {@link fqn.Sn Sn}.\n * @param other the other object to be used as a reference.\n * @param ignoredFields fields name that must be ignored.\n * \n * \n * @return the DSL matcher\n */\npublic static fqn.SnMatchers.SnMatcher snWithSameValue(fqn.Sn other,String... ignoredFields) {\n SnMatcher m=new SnMatcherImpl();\n return m;\n}\n"); } } diff --git a/src/test/java/ch/powerunit/extensions/matchers/provideprocessor/fields/DefaultFieldDescriptionTest.java b/src/test/java/ch/powerunit/extensions/matchers/provideprocessor/fields/DefaultFieldDescriptionTest.java index f77abc490..bda108a5f 100644 --- a/src/test/java/ch/powerunit/extensions/matchers/provideprocessor/fields/DefaultFieldDescriptionTest.java +++ b/src/test/java/ch/powerunit/extensions/matchers/provideprocessor/fields/DefaultFieldDescriptionTest.java @@ -4,6 +4,7 @@ import java.util.Arrays; import java.util.List; +import java.util.Optional; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.ExecutableElement; @@ -142,10 +143,28 @@ public void testGetFieldCopy() { DefaultFieldDescription undertest = new DefaultFieldDescription(() -> provideMatchersAnnotatedElementMirror, new FieldDescriptionMirror(() -> provideMatchersAnnotatedElementMirror, "field", "boolean", executableElement)); - assertThat(undertest.getFieldCopy("a", "b")) + assertThat(undertest.getFieldCopy("a", "b","")) .is("a.field((org.hamcrest.Matcher)org.hamcrest.Matchers.is((java.lang.Object)b.field()))"); } + @Test + public void testGetFieldCopyIgnoreAbsent() { + DefaultFieldDescription undertest = new DefaultFieldDescription(() -> provideMatchersAnnotatedElementMirror, + new FieldDescriptionMirror(() -> provideMatchersAnnotatedElementMirror, "field", "boolean", + executableElement)); + assertThat(undertest.getFieldCopy("a", "b", Optional.empty())) + .is("a.field((org.hamcrest.Matcher)org.hamcrest.Matchers.is((java.lang.Object)b.field()))"); + } + + @Test + public void testGetFieldCopyIgnorePresent() { + DefaultFieldDescription undertest = new DefaultFieldDescription(() -> provideMatchersAnnotatedElementMirror, + new FieldDescriptionMirror(() -> provideMatchersAnnotatedElementMirror, "field", "boolean", + executableElement)); + assertThat(undertest.getFieldCopy("a", "b", Optional.of("x"))).is( + "if (!java.util.Arrays.asList(x).contains(\"field\")) {a.field((org.hamcrest.Matcher)org.hamcrest.Matchers.is((java.lang.Object)b.field()));}"); + } + @Test public void testGetMatcherForField() { DefaultFieldDescription undertest = new DefaultFieldDescription(() -> provideMatchersAnnotatedElementMirror, diff --git a/src/test/java/ch/powerunit/extensions/matchers/provideprocessor/fields/IgnoreFieldDescriptionTest.java b/src/test/java/ch/powerunit/extensions/matchers/provideprocessor/fields/IgnoreFieldDescriptionTest.java index 67fb2a592..ce6a14795 100644 --- a/src/test/java/ch/powerunit/extensions/matchers/provideprocessor/fields/IgnoreFieldDescriptionTest.java +++ b/src/test/java/ch/powerunit/extensions/matchers/provideprocessor/fields/IgnoreFieldDescriptionTest.java @@ -100,7 +100,7 @@ public void testAsMatcherField() { @Test public void testGetFieldCopy() { - String result = new IgnoreFieldDescription(element, field).getFieldCopy("lhs", "rhs"); + String result = new IgnoreFieldDescription(element, field).getFieldCopy("lhs", "rhs",""); assertThat(result).is("/* ignored - fn */"); } diff --git a/src/test/java/ch/powerunit/extensions/matchers/samples/extensions/jackson/JacksonPojo.java b/src/test/java/ch/powerunit/extensions/matchers/samples/extensions/jackson/JacksonPojo.java deleted file mode 100644 index ae24a4f48..000000000 --- a/src/test/java/ch/powerunit/extensions/matchers/samples/extensions/jackson/JacksonPojo.java +++ /dev/null @@ -1,12 +0,0 @@ -package ch.powerunit.extensions.matchers.samples.extensions.jackson; - -import com.fasterxml.jackson.databind.JsonNode; - -import ch.powerunit.extensions.matchers.ProvideMatchers; - -@ProvideMatchers(extensions = ProvideMatchers.JSON_EXTENSION) -public class JacksonPojo { - - public JsonNode p1; - -} diff --git a/src/test/java/ch/powerunit/extensions/matchers/samples/extensions/jackson/JacksonPojoDisabled.java b/src/test/java/ch/powerunit/extensions/matchers/samples/extensions/jackson/JacksonPojoDisabled.java deleted file mode 100644 index 00458dff1..000000000 --- a/src/test/java/ch/powerunit/extensions/matchers/samples/extensions/jackson/JacksonPojoDisabled.java +++ /dev/null @@ -1,12 +0,0 @@ -package ch.powerunit.extensions.matchers.samples.extensions.jackson; - -import com.fasterxml.jackson.databind.JsonNode; - -import ch.powerunit.extensions.matchers.ProvideMatchers; - -@ProvideMatchers(extensions = {}) -public class JacksonPojoDisabled { - - public JsonNode p1; - -}