From 27985d57e823c4c481840d2b92a6c5316dbc4b43 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 10 Jun 2025 18:07:37 +0000 Subject: [PATCH 1/5] Initial plan for issue From 80aae95c40d06af8b029c6209e68293d8fafe6ac Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 10 Jun 2025 18:14:59 +0000 Subject: [PATCH 2/5] Complete: Add wildcard semantics tests and remove TODO puzzle Co-authored-by: yegor256 <526301+yegor256@users.noreply.github.com> --- .../java/org/cactoos/scalar/package-info.java | 3 - .../cactoos/scalar/WildcardSemanticsTest.java | 153 ++++++++++++++++++ 2 files changed, 153 insertions(+), 3 deletions(-) create mode 100644 src/test/java/org/cactoos/scalar/WildcardSemanticsTest.java diff --git a/src/main/java/org/cactoos/scalar/package-info.java b/src/main/java/org/cactoos/scalar/package-info.java index 6941ba132..988cfaaec 100644 --- a/src/main/java/org/cactoos/scalar/package-info.java +++ b/src/main/java/org/cactoos/scalar/package-info.java @@ -7,8 +7,5 @@ * Scalars. * * @since 0.12 - * @todo #1569:30min Create tests for the semantics of relaxed wildcards - * in changed classes of {@link org.cactoos.scalar} package in #1569, - * which is a child of #1533. */ package org.cactoos.scalar; diff --git a/src/test/java/org/cactoos/scalar/WildcardSemanticsTest.java b/src/test/java/org/cactoos/scalar/WildcardSemanticsTest.java new file mode 100644 index 000000000..83daba6a8 --- /dev/null +++ b/src/test/java/org/cactoos/scalar/WildcardSemanticsTest.java @@ -0,0 +1,153 @@ +/* + * SPDX-FileCopyrightText: Copyright (c) 2017-2025 Yegor Bugayenko + * SPDX-License-Identifier: MIT + */ +package org.cactoos.scalar; + +import java.util.List; +import java.util.ArrayList; +import org.cactoos.Func; +import org.cactoos.Proc; +import org.cactoos.Scalar; +import org.cactoos.Text; +import org.cactoos.func.FuncOf; +import org.cactoos.proc.ProcOf; +import org.cactoos.text.TextOf; +import org.cactoos.text.Upper; +import org.junit.jupiter.api.Test; +import org.llorllale.cactoos.matchers.Assertion; +import org.llorllale.cactoos.matchers.HasValue; +import org.llorllale.cactoos.matchers.IsText; + +/** + * Tests for wildcard semantics in scalar classes. + * This test class verifies the proper behavior of relaxed wildcards + * (? extends T, ? super T) in the scalar package as requested in #1569. + * + * @since 1.0.0 + * @checkstyle JavadocMethodCheck (500 lines) + */ +final class WildcardSemanticsTest { + + @Test + void scalarOfAcceptsCovariantFunc() { + // Testing ScalarOf constructor with Func + final Func func = input -> input.toString(); + final String input = "test"; + new Assertion<>( + "ScalarOf must accept covariant function", + new ScalarOf<>(func, input), + new HasValue<>("test") + ).affirm(); + } + + @Test + void scalarOfAcceptsContravariantProc() { + // Testing ScalarOf constructor with Proc + final List result = new ArrayList<>(); + final Proc proc = input -> result.add(input.toString()); + final String input = "hello"; + final String expected = "world"; + new Assertion<>( + "ScalarOf must accept contravariant processor", + new ScalarOf<>(proc, input, expected), + new HasValue<>(expected) + ).affirm(); + } + + @Test + void mappedAcceptsCovariantScalar() { + // Testing Mapped with Scalar + final Scalar scalar = () -> "hello"; + final Func func = input -> new Upper(new TextOf(input.toString())); + new Assertion<>( + "Mapped must accept covariant scalar", + new Mapped<>(func, scalar), + new HasValue<>(new IsText("HELLO")) + ).affirm(); + } + + @Test + void mappedAcceptsContravariantFunc() { + // Testing Mapped with Func + final Scalar scalar = () -> "hello"; + final Func func = input -> new Upper(new TextOf(input.toString())); + new Assertion<>( + "Mapped must accept contravariant function", + new Mapped<>(func, scalar), + new HasValue<>(new IsText("HELLO")) + ).affirm(); + } + + @Test + void andAcceptsContravariantFunc() { + // Testing And with Func + final Func func = input -> input.length() > 0; + final String[] inputs = {"hello", "world"}; + new Assertion<>( + "And must accept contravariant function", + new And(func, inputs), + new HasValue<>(true) + ).affirm(); + } + + @Test + void andAcceptsCovariantIterable() { + // Testing And with Iterable + final Func func = input -> input.length() > 0; + final List inputs = List.of("hello", "world"); + new Assertion<>( + "And must accept covariant iterable", + new And(func, inputs), + new HasValue<>(true) + ).affirm(); + } + + @Test + void orAcceptsContravariantFunc() { + // Testing Or with Func + final Func func = input -> input.length() > 5; + final String[] inputs = {"hi", "hello"}; + new Assertion<>( + "Or must accept contravariant function", + new Or(func, inputs), + new HasValue<>(false) + ).affirm(); + } + + @Test + void orAcceptsCovariantIterable() { + // Testing Or with Iterable + final Func func = input -> input.length() > 3; + final List inputs = List.of("hi", "hello"); + new Assertion<>( + "Or must accept covariant iterable", + new Or(func, inputs), + new HasValue<>(true) + ).affirm(); + } + + @Test + void flattenedAcceptsNestedWildcards() { + // Testing Flattened with Scalar> + final Scalar inner = () -> "test"; + final Scalar> outer = () -> inner; + new Assertion<>( + "Flattened must accept nested wildcards", + new Flattened<>(outer), + new HasValue<>("test") + ).affirm(); + } + + @Test + void scalarWithFallbackAcceptsCovariantScalar() { + // Testing ScalarWithFallback with Scalar + final Scalar scalar = () -> "success"; + new Assertion<>( + "ScalarWithFallback must accept covariant scalar", + new ScalarWithFallback<>(scalar), + new HasValue<>("success") + ).affirm(); + } + +} \ No newline at end of file From a9e84b47420758a6687a7561c571209de9b0e840 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 10 Jun 2025 19:27:48 +0000 Subject: [PATCH 3/5] Fix Java 8 compatibility and remove unused imports in WildcardSemanticsTest Co-authored-by: yegor256 <526301+yegor256@users.noreply.github.com> --- .../java/org/cactoos/scalar/WildcardSemanticsTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/cactoos/scalar/WildcardSemanticsTest.java b/src/test/java/org/cactoos/scalar/WildcardSemanticsTest.java index 83daba6a8..217d42790 100644 --- a/src/test/java/org/cactoos/scalar/WildcardSemanticsTest.java +++ b/src/test/java/org/cactoos/scalar/WildcardSemanticsTest.java @@ -10,8 +10,7 @@ import org.cactoos.Proc; import org.cactoos.Scalar; import org.cactoos.Text; -import org.cactoos.func.FuncOf; -import org.cactoos.proc.ProcOf; +import org.cactoos.iterable.IterableOf; import org.cactoos.text.TextOf; import org.cactoos.text.Upper; import org.junit.jupiter.api.Test; @@ -95,7 +94,7 @@ void andAcceptsContravariantFunc() { void andAcceptsCovariantIterable() { // Testing And with Iterable final Func func = input -> input.length() > 0; - final List inputs = List.of("hello", "world"); + final IterableOf inputs = new IterableOf<>("hello", "world"); new Assertion<>( "And must accept covariant iterable", new And(func, inputs), @@ -119,7 +118,7 @@ void orAcceptsContravariantFunc() { void orAcceptsCovariantIterable() { // Testing Or with Iterable final Func func = input -> input.length() > 3; - final List inputs = List.of("hi", "hello"); + final IterableOf inputs = new IterableOf<>("hi", "hello"); new Assertion<>( "Or must accept covariant iterable", new Or(func, inputs), From f8ccb11771fc2857333733abec55f94056dc82b4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 11 Jun 2025 06:57:45 +0000 Subject: [PATCH 4/5] Remove method body comments from WildcardSemanticsTest Co-authored-by: yegor256 <526301+yegor256@users.noreply.github.com> --- .../java/org/cactoos/scalar/WildcardSemanticsTest.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/test/java/org/cactoos/scalar/WildcardSemanticsTest.java b/src/test/java/org/cactoos/scalar/WildcardSemanticsTest.java index 217d42790..5d9044498 100644 --- a/src/test/java/org/cactoos/scalar/WildcardSemanticsTest.java +++ b/src/test/java/org/cactoos/scalar/WildcardSemanticsTest.java @@ -30,7 +30,6 @@ final class WildcardSemanticsTest { @Test void scalarOfAcceptsCovariantFunc() { - // Testing ScalarOf constructor with Func final Func func = input -> input.toString(); final String input = "test"; new Assertion<>( @@ -42,7 +41,6 @@ void scalarOfAcceptsCovariantFunc() { @Test void scalarOfAcceptsContravariantProc() { - // Testing ScalarOf constructor with Proc final List result = new ArrayList<>(); final Proc proc = input -> result.add(input.toString()); final String input = "hello"; @@ -56,7 +54,6 @@ void scalarOfAcceptsContravariantProc() { @Test void mappedAcceptsCovariantScalar() { - // Testing Mapped with Scalar final Scalar scalar = () -> "hello"; final Func func = input -> new Upper(new TextOf(input.toString())); new Assertion<>( @@ -68,7 +65,6 @@ void mappedAcceptsCovariantScalar() { @Test void mappedAcceptsContravariantFunc() { - // Testing Mapped with Func final Scalar scalar = () -> "hello"; final Func func = input -> new Upper(new TextOf(input.toString())); new Assertion<>( @@ -80,7 +76,6 @@ void mappedAcceptsContravariantFunc() { @Test void andAcceptsContravariantFunc() { - // Testing And with Func final Func func = input -> input.length() > 0; final String[] inputs = {"hello", "world"}; new Assertion<>( @@ -92,7 +87,6 @@ void andAcceptsContravariantFunc() { @Test void andAcceptsCovariantIterable() { - // Testing And with Iterable final Func func = input -> input.length() > 0; final IterableOf inputs = new IterableOf<>("hello", "world"); new Assertion<>( @@ -104,7 +98,6 @@ void andAcceptsCovariantIterable() { @Test void orAcceptsContravariantFunc() { - // Testing Or with Func final Func func = input -> input.length() > 5; final String[] inputs = {"hi", "hello"}; new Assertion<>( @@ -116,7 +109,6 @@ void orAcceptsContravariantFunc() { @Test void orAcceptsCovariantIterable() { - // Testing Or with Iterable final Func func = input -> input.length() > 3; final IterableOf inputs = new IterableOf<>("hi", "hello"); new Assertion<>( @@ -128,7 +120,6 @@ void orAcceptsCovariantIterable() { @Test void flattenedAcceptsNestedWildcards() { - // Testing Flattened with Scalar> final Scalar inner = () -> "test"; final Scalar> outer = () -> inner; new Assertion<>( @@ -140,7 +131,6 @@ void flattenedAcceptsNestedWildcards() { @Test void scalarWithFallbackAcceptsCovariantScalar() { - // Testing ScalarWithFallback with Scalar final Scalar scalar = () -> "success"; new Assertion<>( "ScalarWithFallback must accept covariant scalar", From 9a70f91efb5fb438cd41ba197d9ffc7b88f33491 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 11 Jun 2025 10:02:57 +0000 Subject: [PATCH 5/5] Fix qulice violations in WildcardSemanticsTest Co-authored-by: yegor256 <526301+yegor256@users.noreply.github.com> --- .../cactoos/scalar/WildcardSemanticsTest.java | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/test/java/org/cactoos/scalar/WildcardSemanticsTest.java b/src/test/java/org/cactoos/scalar/WildcardSemanticsTest.java index 5d9044498..f450ea4dd 100644 --- a/src/test/java/org/cactoos/scalar/WildcardSemanticsTest.java +++ b/src/test/java/org/cactoos/scalar/WildcardSemanticsTest.java @@ -4,8 +4,8 @@ */ package org.cactoos.scalar; -import java.util.List; import java.util.ArrayList; +import java.util.List; import org.cactoos.Func; import org.cactoos.Proc; import org.cactoos.Scalar; @@ -28,6 +28,11 @@ */ final class WildcardSemanticsTest { + /** + * Test string constant. + */ + private static final String HELLO = "hello"; + @Test void scalarOfAcceptsCovariantFunc() { final Func func = input -> input.toString(); @@ -41,9 +46,9 @@ void scalarOfAcceptsCovariantFunc() { @Test void scalarOfAcceptsContravariantProc() { - final List result = new ArrayList<>(); + final List result = new ArrayList<>(1); final Proc proc = input -> result.add(input.toString()); - final String input = "hello"; + final String input = WildcardSemanticsTest.HELLO; final String expected = "world"; new Assertion<>( "ScalarOf must accept contravariant processor", @@ -54,7 +59,7 @@ void scalarOfAcceptsContravariantProc() { @Test void mappedAcceptsCovariantScalar() { - final Scalar scalar = () -> "hello"; + final Scalar scalar = () -> WildcardSemanticsTest.HELLO; final Func func = input -> new Upper(new TextOf(input.toString())); new Assertion<>( "Mapped must accept covariant scalar", @@ -65,7 +70,7 @@ void mappedAcceptsCovariantScalar() { @Test void mappedAcceptsContravariantFunc() { - final Scalar scalar = () -> "hello"; + final Scalar scalar = () -> WildcardSemanticsTest.HELLO; final Func func = input -> new Upper(new TextOf(input.toString())); new Assertion<>( "Mapped must accept contravariant function", @@ -77,7 +82,7 @@ void mappedAcceptsContravariantFunc() { @Test void andAcceptsContravariantFunc() { final Func func = input -> input.length() > 0; - final String[] inputs = {"hello", "world"}; + final String[] inputs = {WildcardSemanticsTest.HELLO, "world"}; new Assertion<>( "And must accept contravariant function", new And(func, inputs), @@ -88,7 +93,7 @@ void andAcceptsContravariantFunc() { @Test void andAcceptsCovariantIterable() { final Func func = input -> input.length() > 0; - final IterableOf inputs = new IterableOf<>("hello", "world"); + final IterableOf inputs = new IterableOf<>(WildcardSemanticsTest.HELLO, "world"); new Assertion<>( "And must accept covariant iterable", new And(func, inputs), @@ -99,7 +104,7 @@ void andAcceptsCovariantIterable() { @Test void orAcceptsContravariantFunc() { final Func func = input -> input.length() > 5; - final String[] inputs = {"hi", "hello"}; + final String[] inputs = {"hi", WildcardSemanticsTest.HELLO}; new Assertion<>( "Or must accept contravariant function", new Or(func, inputs), @@ -110,7 +115,7 @@ void orAcceptsContravariantFunc() { @Test void orAcceptsCovariantIterable() { final Func func = input -> input.length() > 3; - final IterableOf inputs = new IterableOf<>("hi", "hello"); + final IterableOf inputs = new IterableOf<>("hi", WildcardSemanticsTest.HELLO); new Assertion<>( "Or must accept covariant iterable", new Or(func, inputs), @@ -139,4 +144,4 @@ void scalarWithFallbackAcceptsCovariantScalar() { ).affirm(); } -} \ No newline at end of file +}