From 6d4e2451047ef95dc415bf947a6d8087e841af2f Mon Sep 17 00:00:00 2001 From: Andrew Smirnov Date: Sun, 26 Jan 2025 18:06:27 +0300 Subject: [PATCH 1/3] use Expect for EOmalloc$EOof$EOallocated$EOread --- .../EOmalloc$EOof$EOallocated$EOread.java | 8 +- .../EOmalloc$EOof$EOallocated$EOresized.java | 13 +- .../EOmalloc$EOof$EOallocated$EOsize.java | 4 +- .../EOmalloc$EOof$EOallocated$EOwrite.java | 5 +- .../EOeolang/EOmalloc$EOof$EO\317\206.java" | 3 +- .../EOmalloc$EOof$EOallocated$EOreadTest.java | 158 ++++++++++++++++++ .../java/EOorg/EOeolang/EOmallocTest.java | 67 ++++++++ 7 files changed, 238 insertions(+), 20 deletions(-) create mode 100644 eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOreadTest.java diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOread.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOread.java index 9db74d99d65..ad06879da28 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOread.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOread.java @@ -32,7 +32,7 @@ import org.eolang.Atom; import org.eolang.Attr; import org.eolang.Data; -import org.eolang.Dataized; +import org.eolang.Expect; import org.eolang.PhDefault; import org.eolang.Phi; import org.eolang.XmirObject; @@ -58,9 +58,9 @@ public final class EOmalloc$EOof$EOallocated$EOread extends PhDefault implements public Phi lambda() { return new Data.ToPhi( Heaps.INSTANCE.read( - new Dataized(this.take(Attr.RHO).take("id")).asNumber().intValue(), - new Dataized(this.take("offset")).asNumber().intValue(), - new Dataized(this.take("length")).asNumber().intValue() + new Expect.Int(Expect.at(this.take(Attr.RHO), "id")).it(), + new Expect.Int(Expect.at(this, "offset")).it(), + new Expect.Int(Expect.at(this, "length")).it() ) ); } diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOresized.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOresized.java index e38356e8466..869a0e01a61 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOresized.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOresized.java @@ -31,7 +31,6 @@ import org.eolang.AtVoid; import org.eolang.Atom; import org.eolang.Attr; -import org.eolang.Dataized; import org.eolang.Expect; import org.eolang.PhDefault; import org.eolang.Phi; @@ -56,16 +55,8 @@ public final class EOmalloc$EOof$EOallocated$EOresized extends PhDefault impleme @Override public Phi lambda() { final Phi rho = this.take(Attr.RHO); - final int id = Expect.at(rho, "id") - .that(phi -> new Dataized(phi).asNumber()) - .otherwise("must be a number") - .that(Double::intValue) - .it(); - final int size = Expect.at(this, "new-size") - .that(phi -> new Dataized(phi).asNumber()) - .otherwise("must be a number") - .that(Double::intValue) - .it(); + final int id = new Expect.Int(Expect.at(rho, "id")).it(); + final int size = new Expect.Int(Expect.at(this, "new-size")).it(); Heaps.INSTANCE.resize(id, size); return rho; } diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOsize.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOsize.java index b803eb630ee..fcee96e8927 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOsize.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOsize.java @@ -31,7 +31,7 @@ import org.eolang.Atom; import org.eolang.Attr; import org.eolang.Data; -import org.eolang.Dataized; +import org.eolang.Expect; import org.eolang.PhDefault; import org.eolang.Phi; import org.eolang.XmirObject; @@ -48,7 +48,7 @@ public final class EOmalloc$EOof$EOallocated$EOsize extends PhDefault implements public Phi lambda() { return new Data.ToPhi( Heaps.INSTANCE.size( - new Dataized(this.take(Attr.RHO).take("id")).asNumber().intValue() + new Expect.Int(Expect.at(this.take(Attr.RHO), "id")).it() ) ); } diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOwrite.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOwrite.java index 8e3d9fc515b..7722c68ddf7 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOwrite.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOwrite.java @@ -33,6 +33,7 @@ import org.eolang.Attr; import org.eolang.Data; import org.eolang.Dataized; +import org.eolang.Expect; import org.eolang.PhDefault; import org.eolang.Phi; import org.eolang.XmirObject; @@ -57,8 +58,8 @@ public final class EOmalloc$EOof$EOallocated$EOwrite extends PhDefault implement @Override public Phi lambda() { Heaps.INSTANCE.write( - new Dataized(this.take(Attr.RHO).take("id")).asNumber().intValue(), - new Dataized(this.take("offset")).asNumber().intValue(), + new Expect.Int(Expect.at(this.take(Attr.RHO), "id")).it(), + new Expect.Int(Expect.at(this, "offset")).it(), new Dataized(this.take("data")).take() ); return new Data.ToPhi(true); diff --git "a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EO\317\206.java" "b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EO\317\206.java" index cd89282645c..549a6a91164 100644 --- "a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EO\317\206.java" +++ "b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EO\317\206.java" @@ -32,6 +32,7 @@ import org.eolang.Attr; import org.eolang.Data; import org.eolang.Dataized; +import org.eolang.Expect; import org.eolang.PhDefault; import org.eolang.Phi; import org.eolang.XmirObject; @@ -48,7 +49,7 @@ public final class EOmalloc$EOof$EOφ extends PhDefault implements Atom { public Phi lambda() { final Phi rho = this.take(Attr.RHO); final int identifier = Heaps.INSTANCE.malloc( - this, new Dataized(rho.take("size")).asNumber().intValue() + this, new Expect.Int(Expect.at(rho, "size")).it() ); final Phi res; try { diff --git a/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOreadTest.java b/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOreadTest.java new file mode 100644 index 00000000000..8cf7e5d1d80 --- /dev/null +++ b/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOreadTest.java @@ -0,0 +1,158 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2016-2025 Objectionary.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* + * @checkstyle PackageNameCheck (4 lines) + * @checkstyle TrailingCommentCheck (3 lines) + */ +package EOorg.EOeolang; // NOPMD + +import org.eolang.Attr; +import org.eolang.Data; +import org.eolang.Dataized; +import org.eolang.ExAbstract; +import org.eolang.PhWith; +import org.eolang.Phi; +import org.hamcrest.MatcherAssert; +import org.hamcrest.Matchers; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +/** + * Test case for {@link EOmalloc$EOof$EOallocated$EOread}. + * + * @since 0.51.2 + * @checkstyle TypeNameCheck (5 lines) + */ +@SuppressWarnings("PMD.AvoidDollarSigns") +final class EOmalloc$EOof$EOallocated$EOreadTest { + + @Test + void throwsCorrectErrorForOffsetAttrNaN() { + MatcherAssert.assertThat( + "the message in the error is correct", + Assertions.assertThrows( + ExAbstract.class, + () -> new Dataized( + new PhWith( + new Dummy().it(), + "offset", + new Data.ToPhi(true) + ) + ).take(), + "put TRUE in int attr fails with a proper message that explains what happened" + ).getMessage(), + Matchers.equalTo("the 'offset' attribute must be a number") + ); + } + + @Test + void throwsCorrectErrorForOffsetAttrNotAnInt() { + MatcherAssert.assertThat( + "the message in the error is correct", + Assertions.assertThrows( + ExAbstract.class, + () -> new Dataized( + new PhWith( + new Dummy().it(), + "offset", + new Data.ToPhi(42.42) + ) + ).take(), + "put double in int attr fails with a proper message that explains what happened" + ).getMessage(), + Matchers.equalTo("the 'offset' attribute (42.42) must be an integer") + ); + } + + @Test + void throwsCorrectErrorForLengthAttrNaN() { + MatcherAssert.assertThat( + "the message in the error is correct", + Assertions.assertThrows( + ExAbstract.class, + () -> new Dataized( + new PhWith( + new PhWith( + new Dummy().it(), + "offset", + new Data.ToPhi(42) + ), + "length", + new Data.ToPhi(true) + ) + ).take(), + "put TRUE in int attr fails with a proper message that explains what happened" + ).getMessage(), + Matchers.equalTo("the 'length' attribute must be a number") + ); + } + + @Test + void throwsCorrectErrorForLengthAttrNotAnInt() { + MatcherAssert.assertThat( + "the message in the error is correct", + Assertions.assertThrows( + ExAbstract.class, + () -> new Dataized( + new PhWith( + new PhWith( + new Dummy().it(), + "offset", + new Data.ToPhi(42) + ), + "length", + new Data.ToPhi(42.42) + ) + ).take(), + "put double in int attr fails with a proper message that explains what happened" + ).getMessage(), + Matchers.equalTo("the 'length' attribute (42.42) must be an integer") + ); + } + + /** + * Dummy with correct id attr. + * @since 0.51.2 + */ + @SuppressWarnings("PMD.MethodNameCheck") + private static final class Dummy { + /** + * Produce EOmalloc$EOof$EOallocated$EOread with id attr. + * @checkstyle TypeNameCheck (5 lines) + */ + private Phi it() { + return new PhWith( + new EOmalloc$EOof$EOallocated$EOread(), + Attr.RHO, + new PhWith( + new EOmallocTest.IdDummy(), + "id", + new Data.ToPhi(42) + ) + ); + } + } + +} diff --git a/eo-runtime/src/test/java/EOorg/EOeolang/EOmallocTest.java b/eo-runtime/src/test/java/EOorg/EOeolang/EOmallocTest.java index 059b77b2d18..106405d673d 100644 --- a/eo-runtime/src/test/java/EOorg/EOeolang/EOmallocTest.java +++ b/eo-runtime/src/test/java/EOorg/EOeolang/EOmallocTest.java @@ -39,8 +39,12 @@ import org.eolang.PhDefault; import org.eolang.PhWith; import org.eolang.Phi; +import org.hamcrest.MatcherAssert; +import org.hamcrest.Matchers; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; /** * Test case for {@link EOmalloc}. @@ -85,6 +89,54 @@ void freesMemoryIfErrorIsOccurred() { ); } + @ParameterizedTest + @ValueSource(classes = EOmalloc$EOof$EOallocated$EOread.class) + void throwsCorrectErrorForIdAttrNaN(final Class cls) { + MatcherAssert.assertThat( + "the message in the error is correct", + Assertions.assertThrows( + ExAbstract.class, + () -> new Dataized( + new PhWith( + (Phi) cls.getDeclaredConstructor().newInstance(), + Attr.RHO, + new PhWith( + new EOmallocTest.IdDummy(), + "id", + new Data.ToPhi(true) + ) + ) + ).take(), + "put TRUE in int attr fails with a proper message that explains what happened" + ).getMessage(), + Matchers.equalTo("the 'id' attribute must be a number") + ); + } + + @ParameterizedTest + @ValueSource(classes = EOmalloc$EOof$EOallocated$EOread.class) + void throwsCorrectErrorForIdAttrNotAnInt(final Class cls) { + MatcherAssert.assertThat( + "the message in the error is correct", + Assertions.assertThrows( + ExAbstract.class, + () -> new Dataized( + new PhWith( + (Phi) cls.getDeclaredConstructor().newInstance(), + Attr.RHO, + new PhWith( + new EOmallocTest.IdDummy(), + "id", + new Data.ToPhi(42.42) + ) + ) + ).take(), + "put double in int attr fails with a proper message that explains what happened" + ).getMessage(), + Matchers.equalTo("the 'id' attribute (42.42) must be an integer") + ); + } + /** * Allocated data. * @param obj Init object @@ -129,6 +181,20 @@ private static class Dummy extends PhDefault { } } + /** + * Dummy with id attr. + * @since 0.51.2 + */ + static class IdDummy extends PhDefault { + /** + * Ctor. + */ + @SuppressWarnings("PMD.ConstructorOnlyInitializesOrCallOtherConstructors") + IdDummy() { + this.add("id", new AtVoid("id")); + } + } + /** * Dummy that throws an exception. * @since 0.36.0 @@ -164,4 +230,5 @@ private static class ErrorDummy extends PhDefault { ); } } + } From 5300996c7921866d0653f0606537dcb8bd7c8eb0 Mon Sep 17 00:00:00 2001 From: asmirnov-backend Date: Sat, 8 Feb 2025 11:37:00 +0300 Subject: [PATCH 2/3] Add tests for EOmalloc objects --- .../EOmalloc$EOof$EOallocated$EOreadTest.java | 69 +---------- ...malloc$EOof$EOallocated$EOresizedTest.java | 87 ++++++++++++++ .../EOmalloc$EOof$EO\317\206Test.java" | 111 ++++++++++++++++++ .../java/EOorg/EOeolang/EOmallocTest.java | 101 +++++++++++++++- 4 files changed, 298 insertions(+), 70 deletions(-) create mode 100644 eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOresizedTest.java create mode 100644 "eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EO\317\206Test.java" diff --git a/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOreadTest.java b/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOreadTest.java index 8cf7e5d1d80..5dbfe4190af 100644 --- a/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOreadTest.java +++ b/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOreadTest.java @@ -28,12 +28,10 @@ */ package EOorg.EOeolang; // NOPMD -import org.eolang.Attr; import org.eolang.Data; import org.eolang.Dataized; import org.eolang.ExAbstract; import org.eolang.PhWith; -import org.eolang.Phi; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; import org.junit.jupiter.api.Assertions; @@ -42,50 +40,12 @@ /** * Test case for {@link EOmalloc$EOof$EOallocated$EOread}. * - * @since 0.51.2 + * @since 0.52 * @checkstyle TypeNameCheck (5 lines) */ @SuppressWarnings("PMD.AvoidDollarSigns") final class EOmalloc$EOof$EOallocated$EOreadTest { - @Test - void throwsCorrectErrorForOffsetAttrNaN() { - MatcherAssert.assertThat( - "the message in the error is correct", - Assertions.assertThrows( - ExAbstract.class, - () -> new Dataized( - new PhWith( - new Dummy().it(), - "offset", - new Data.ToPhi(true) - ) - ).take(), - "put TRUE in int attr fails with a proper message that explains what happened" - ).getMessage(), - Matchers.equalTo("the 'offset' attribute must be a number") - ); - } - - @Test - void throwsCorrectErrorForOffsetAttrNotAnInt() { - MatcherAssert.assertThat( - "the message in the error is correct", - Assertions.assertThrows( - ExAbstract.class, - () -> new Dataized( - new PhWith( - new Dummy().it(), - "offset", - new Data.ToPhi(42.42) - ) - ).take(), - "put double in int attr fails with a proper message that explains what happened" - ).getMessage(), - Matchers.equalTo("the 'offset' attribute (42.42) must be an integer") - ); - } - @Test void throwsCorrectErrorForLengthAttrNaN() { MatcherAssert.assertThat( @@ -95,7 +55,7 @@ void throwsCorrectErrorForLengthAttrNaN() { () -> new Dataized( new PhWith( new PhWith( - new Dummy().it(), + new EOmallocTest.PhiWithDummyId(new EOmalloc$EOof$EOallocated$EOread()).it(), "offset", new Data.ToPhi(42) ), @@ -118,7 +78,7 @@ void throwsCorrectErrorForLengthAttrNotAnInt() { () -> new Dataized( new PhWith( new PhWith( - new Dummy().it(), + new EOmallocTest.PhiWithDummyId(new EOmalloc$EOof$EOallocated$EOread()).it(), "offset", new Data.ToPhi(42) ), @@ -132,27 +92,4 @@ void throwsCorrectErrorForLengthAttrNotAnInt() { ); } - /** - * Dummy with correct id attr. - * @since 0.51.2 - */ - @SuppressWarnings("PMD.MethodNameCheck") - private static final class Dummy { - /** - * Produce EOmalloc$EOof$EOallocated$EOread with id attr. - * @checkstyle TypeNameCheck (5 lines) - */ - private Phi it() { - return new PhWith( - new EOmalloc$EOof$EOallocated$EOread(), - Attr.RHO, - new PhWith( - new EOmallocTest.IdDummy(), - "id", - new Data.ToPhi(42) - ) - ); - } - } - } diff --git a/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOresizedTest.java b/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOresizedTest.java new file mode 100644 index 00000000000..ed857cc3a7d --- /dev/null +++ b/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOresizedTest.java @@ -0,0 +1,87 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2016-2025 Objectionary.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* + * @checkstyle PackageNameCheck (4 lines) + * @checkstyle TrailingCommentCheck (3 lines) + */ +package EOorg.EOeolang; // NOPMD + +import org.eolang.Data; +import org.eolang.Dataized; +import org.eolang.ExAbstract; +import org.eolang.PhWith; +import org.hamcrest.MatcherAssert; +import org.hamcrest.Matchers; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +/** + * Test case for {@link EOmalloc$EOof$EOallocated$EOresized}. + * + * @since 0.52 + * @checkstyle TypeNameCheck (5 lines) + */ +@SuppressWarnings("PMD.AvoidDollarSigns") +final class EOmalloc$EOof$EOallocated$EOresizedTest { + + @Test + void throwsCorrectErrorForNewSizeAttrNaN() { + MatcherAssert.assertThat( + "the message in the error is correct", + Assertions.assertThrows( + ExAbstract.class, + () -> new Dataized( + new PhWith( + new EOmallocTest.PhiWithDummyId(new EOmalloc$EOof$EOallocated$EOresized()).it(), + "new-size", + new Data.ToPhi(true) + ) + ).take(), + "put TRUE in int attr fails with a proper message that explains what happened" + ).getMessage(), + Matchers.equalTo("the 'new-size' attribute must be a number") + ); + } + + @Test + void throwsCorrectErrorForNewSizeAttrNotAnInt() { + MatcherAssert.assertThat( + "the message in the error is correct", + Assertions.assertThrows( + ExAbstract.class, + () -> new Dataized( + new PhWith( + new EOmallocTest.PhiWithDummyId(new EOmalloc$EOof$EOallocated$EOresized()).it(), + "new-size", + new Data.ToPhi(42.42) + ) + ).take(), + "put double in int attr fails with a proper message that explains what happened" + ).getMessage(), + Matchers.equalTo("the 'new-size' attribute (42.42) must be an integer") + ); + } + +} diff --git "a/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EO\317\206Test.java" "b/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EO\317\206Test.java" new file mode 100644 index 00000000000..58036596f95 --- /dev/null +++ "b/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EO\317\206Test.java" @@ -0,0 +1,111 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2016-2025 Objectionary.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* + * @checkstyle PackageNameCheck (4 lines) + * @checkstyle TrailingCommentCheck (3 lines) + */ +package EOorg.EOeolang; // NOPMD + +import org.eolang.AtVoid; +import org.eolang.Attr; +import org.eolang.Data; +import org.eolang.Dataized; +import org.eolang.ExAbstract; +import org.eolang.PhDefault; +import org.eolang.PhWith; +import org.hamcrest.MatcherAssert; +import org.hamcrest.Matchers; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +/** + * Test case for {@link EOmalloc$EOof$EOφ}. + * + * @since 0.52 + * @checkstyle TypeNameCheck (5 lines) + */ +@SuppressWarnings("PMD.AvoidDollarSigns") +final class EOmalloc$EOof$EOφTest { + + @Test + void throwsCorrectErrorForSizeAttrNaN() { + MatcherAssert.assertThat( + "the message in the error is correct", + Assertions.assertThrows( + ExAbstract.class, + () -> new Dataized( + new PhWith( + new EOmalloc$EOof$EOφ(), + Attr.RHO, + new PhWith( + new EOmalloc$EOof$EOφTest.SizeDummy(), + "size", + new Data.ToPhi(true) + ) + ) + ).take(), + "put TRUE in int attr fails with a proper message that explains what happened" + ).getMessage(), + Matchers.equalTo("the 'size' attribute must be a number") + ); + } + + @Test + void throwsCorrectErrorForSizeAttrNotAnInt() { + MatcherAssert.assertThat( + "the message in the error is correct", + Assertions.assertThrows( + ExAbstract.class, + () -> new Dataized( + new PhWith( + new EOmalloc$EOof$EOφ(), + Attr.RHO, + new PhWith( + new EOmalloc$EOof$EOφTest.SizeDummy(), + "size", + new Data.ToPhi(42.42) + ) + ) + ).take(), + "put double in int attr fails with a proper message that explains what happened" + ).getMessage(), + Matchers.equalTo("the 'size' attribute (42.42) must be an integer") + ); + } + + /** + * Dummy with size attr. + */ + private static class SizeDummy extends PhDefault { + /** + * Ctor. + */ + @SuppressWarnings("PMD.ConstructorOnlyInitializesOrCallOtherConstructors") + SizeDummy() { + this.add("size", new AtVoid("size")); + } + } + +} diff --git a/eo-runtime/src/test/java/EOorg/EOeolang/EOmallocTest.java b/eo-runtime/src/test/java/EOorg/EOeolang/EOmallocTest.java index 106405d673d..a48d4391f80 100644 --- a/eo-runtime/src/test/java/EOorg/EOeolang/EOmallocTest.java +++ b/eo-runtime/src/test/java/EOorg/EOeolang/EOmallocTest.java @@ -90,7 +90,12 @@ void freesMemoryIfErrorIsOccurred() { } @ParameterizedTest - @ValueSource(classes = EOmalloc$EOof$EOallocated$EOread.class) + @ValueSource(classes = { + EOmalloc$EOof$EOallocated$EOread.class, + EOmalloc$EOof$EOallocated$EOresized.class, + EOmalloc$EOof$EOallocated$EOsize.class, + EOmalloc$EOof$EOallocated$EOwrite.class + }) void throwsCorrectErrorForIdAttrNaN(final Class cls) { MatcherAssert.assertThat( "the message in the error is correct", @@ -114,7 +119,12 @@ void throwsCorrectErrorForIdAttrNaN(final Class cls) { } @ParameterizedTest - @ValueSource(classes = EOmalloc$EOof$EOallocated$EOread.class) + @ValueSource(classes = { + EOmalloc$EOof$EOallocated$EOread.class, + EOmalloc$EOof$EOallocated$EOresized.class, + EOmalloc$EOof$EOallocated$EOsize.class, + EOmalloc$EOof$EOallocated$EOwrite.class + }) void throwsCorrectErrorForIdAttrNotAnInt(final Class cls) { MatcherAssert.assertThat( "the message in the error is correct", @@ -137,6 +147,52 @@ void throwsCorrectErrorForIdAttrNotAnInt(final Class cls) { ); } + @ParameterizedTest + @ValueSource(classes = { + EOmalloc$EOof$EOallocated$EOread.class, + EOmalloc$EOof$EOallocated$EOwrite.class + }) + void throwsCorrectErrorForOffsetAttrNaN(final Class cls) { + MatcherAssert.assertThat( + "the message in the error is correct", + Assertions.assertThrows( + ExAbstract.class, + () -> new Dataized( + new PhWith( + new PhiWithDummyId((Phi) cls.getDeclaredConstructor().newInstance()).it(), + "offset", + new Data.ToPhi(true) + ) + ).take(), + "put TRUE in int attr fails with a proper message that explains what happened" + ).getMessage(), + Matchers.equalTo("the 'offset' attribute must be a number") + ); + } + + @ParameterizedTest + @ValueSource(classes = { + EOmalloc$EOof$EOallocated$EOread.class, + EOmalloc$EOof$EOallocated$EOwrite.class + }) + void throwsCorrectErrorForOffsetAttrNotAnInt(final Class cls) { + MatcherAssert.assertThat( + "the message in the error is correct", + Assertions.assertThrows( + ExAbstract.class, + () -> new Dataized( + new PhWith( + new PhiWithDummyId((Phi) cls.getDeclaredConstructor().newInstance()).it(), + "offset", + new Data.ToPhi(42.42) + ) + ).take(), + "put double in int attr fails with a proper message that explains what happened" + ).getMessage(), + Matchers.equalTo("the 'offset' attribute (42.42) must be an integer") + ); + } + /** * Allocated data. * @param obj Init object @@ -181,11 +237,48 @@ private static class Dummy extends PhDefault { } } + /** + * Phi with Dummy with 'id' attribute. + * + * @since 0.52 + */ + static class PhiWithDummyId { + /** + * Phi + */ + private final Phi phi; + + /** + * Ctor. + * @param phi Phi + */ + PhiWithDummyId(Phi phi) { + this.phi = phi; + } + + /** + * Return it. + * @checkstyle MethodNameCheck (5 lines) + */ + public Phi it() { + return new PhWith( + phi, + Attr.RHO, + new PhWith( + new EOmallocTest.IdDummy(), + "id", + new Data.ToPhi(42) + ) + ); + } + } + /** * Dummy with id attr. - * @since 0.51.2 + * + * @since 0.52 */ - static class IdDummy extends PhDefault { + private static class IdDummy extends PhDefault { /** * Ctor. */ From 2f3fe54239626461ec8678027e74915b2b8c8d07 Mon Sep 17 00:00:00 2001 From: asmirnov-backend Date: Sun, 9 Feb 2025 20:08:08 +0300 Subject: [PATCH 3/3] Use Natural instead of Int --- .../EOmalloc$EOof$EOallocated$EOread.java | 6 +-- .../EOmalloc$EOof$EOallocated$EOresized.java | 4 +- .../EOmalloc$EOof$EOallocated$EOsize.java | 2 +- .../EOmalloc$EOof$EOallocated$EOwrite.java | 4 +- .../EOeolang/EOmalloc$EOof$EO\317\206.java" | 2 +- .../EOmalloc$EOof$EOallocated$EOreadTest.java | 33 ++++++++++++++- ...malloc$EOof$EOallocated$EOresizedTest.java | 29 ++++++++++++- .../EOmalloc$EOof$EO\317\206Test.java" | 28 +++++++++++++ .../java/EOorg/EOeolang/EOmallocTest.java | 42 ++++++++++++++++--- 9 files changed, 131 insertions(+), 19 deletions(-) diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOread.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOread.java index ad06879da28..07f28d7a2c1 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOread.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOread.java @@ -58,9 +58,9 @@ public final class EOmalloc$EOof$EOallocated$EOread extends PhDefault implements public Phi lambda() { return new Data.ToPhi( Heaps.INSTANCE.read( - new Expect.Int(Expect.at(this.take(Attr.RHO), "id")).it(), - new Expect.Int(Expect.at(this, "offset")).it(), - new Expect.Int(Expect.at(this, "length")).it() + new Expect.Natural(Expect.at(this.take(Attr.RHO), "id")).it(), + new Expect.Natural(Expect.at(this, "offset")).it(), + new Expect.Natural(Expect.at(this, "length")).it() ) ); } diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOresized.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOresized.java index 869a0e01a61..c2beaac86f5 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOresized.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOresized.java @@ -55,8 +55,8 @@ public final class EOmalloc$EOof$EOallocated$EOresized extends PhDefault impleme @Override public Phi lambda() { final Phi rho = this.take(Attr.RHO); - final int id = new Expect.Int(Expect.at(rho, "id")).it(); - final int size = new Expect.Int(Expect.at(this, "new-size")).it(); + final int id = new Expect.Natural(Expect.at(rho, "id")).it(); + final int size = new Expect.Natural(Expect.at(this, "new-size")).it(); Heaps.INSTANCE.resize(id, size); return rho; } diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOsize.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOsize.java index fcee96e8927..da478258ca1 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOsize.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOsize.java @@ -48,7 +48,7 @@ public final class EOmalloc$EOof$EOallocated$EOsize extends PhDefault implements public Phi lambda() { return new Data.ToPhi( Heaps.INSTANCE.size( - new Expect.Int(Expect.at(this.take(Attr.RHO), "id")).it() + new Expect.Natural(Expect.at(this.take(Attr.RHO), "id")).it() ) ); } diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOwrite.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOwrite.java index 7722c68ddf7..73a4076c7e0 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOwrite.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOwrite.java @@ -58,8 +58,8 @@ public final class EOmalloc$EOof$EOallocated$EOwrite extends PhDefault implement @Override public Phi lambda() { Heaps.INSTANCE.write( - new Expect.Int(Expect.at(this.take(Attr.RHO), "id")).it(), - new Expect.Int(Expect.at(this, "offset")).it(), + new Expect.Natural(Expect.at(this.take(Attr.RHO), "id")).it(), + new Expect.Natural(Expect.at(this, "offset")).it(), new Dataized(this.take("data")).take() ); return new Data.ToPhi(true); diff --git "a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EO\317\206.java" "b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EO\317\206.java" index 549a6a91164..e66bd1db4f0 100644 --- "a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EO\317\206.java" +++ "b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EO\317\206.java" @@ -49,7 +49,7 @@ public final class EOmalloc$EOof$EOφ extends PhDefault implements Atom { public Phi lambda() { final Phi rho = this.take(Attr.RHO); final int identifier = Heaps.INSTANCE.malloc( - this, new Expect.Int(Expect.at(rho, "size")).it() + this, new Expect.Natural(Expect.at(rho, "size")).it() ); final Phi res; try { diff --git a/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOreadTest.java b/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOreadTest.java index 5dbfe4190af..717ac721ef3 100644 --- a/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOreadTest.java +++ b/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOreadTest.java @@ -55,7 +55,9 @@ void throwsCorrectErrorForLengthAttrNaN() { () -> new Dataized( new PhWith( new PhWith( - new EOmallocTest.PhiWithDummyId(new EOmalloc$EOof$EOallocated$EOread()).it(), + new EOmallocTest.PhiWithIdDummy( + new EOmalloc$EOof$EOallocated$EOread() + ).it(), "offset", new Data.ToPhi(42) ), @@ -78,7 +80,9 @@ void throwsCorrectErrorForLengthAttrNotAnInt() { () -> new Dataized( new PhWith( new PhWith( - new EOmallocTest.PhiWithDummyId(new EOmalloc$EOof$EOallocated$EOread()).it(), + new EOmallocTest.PhiWithIdDummy( + new EOmalloc$EOof$EOallocated$EOread() + ).it(), "offset", new Data.ToPhi(42) ), @@ -92,4 +96,29 @@ void throwsCorrectErrorForLengthAttrNotAnInt() { ); } + @Test + void throwsCorrectErrorForLengthAttrNotNatural() { + MatcherAssert.assertThat( + "the message in the error is correct", + Assertions.assertThrows( + ExAbstract.class, + () -> new Dataized( + new PhWith( + new PhWith( + new EOmallocTest.PhiWithIdDummy( + new EOmalloc$EOof$EOallocated$EOread() + ).it(), + "offset", + new Data.ToPhi(42) + ), + "length", + new Data.ToPhi(-42) + ) + ).take(), + "put negative int in natural attr fails with a proper message that explains what happened" + ).getMessage(), + Matchers.equalTo("the 'length' attribute (-42) must be greater or equal to zero") + ); + } + } diff --git a/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOresizedTest.java b/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOresizedTest.java index ed857cc3a7d..4ea1dcccad4 100644 --- a/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOresizedTest.java +++ b/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOresizedTest.java @@ -54,7 +54,9 @@ void throwsCorrectErrorForNewSizeAttrNaN() { ExAbstract.class, () -> new Dataized( new PhWith( - new EOmallocTest.PhiWithDummyId(new EOmalloc$EOof$EOallocated$EOresized()).it(), + new EOmallocTest.PhiWithIdDummy( + new EOmalloc$EOof$EOallocated$EOresized() + ).it(), "new-size", new Data.ToPhi(true) ) @@ -73,7 +75,9 @@ void throwsCorrectErrorForNewSizeAttrNotAnInt() { ExAbstract.class, () -> new Dataized( new PhWith( - new EOmallocTest.PhiWithDummyId(new EOmalloc$EOof$EOallocated$EOresized()).it(), + new EOmallocTest.PhiWithIdDummy( + new EOmalloc$EOof$EOallocated$EOresized() + ).it(), "new-size", new Data.ToPhi(42.42) ) @@ -84,4 +88,25 @@ void throwsCorrectErrorForNewSizeAttrNotAnInt() { ); } + @Test + void throwsCorrectErrorForNewSizeAttrNotNatural() { + MatcherAssert.assertThat( + "the message in the error is correct", + Assertions.assertThrows( + ExAbstract.class, + () -> new Dataized( + new PhWith( + new EOmallocTest.PhiWithIdDummy( + new EOmalloc$EOof$EOallocated$EOresized() + ).it(), + "new-size", + new Data.ToPhi(-42) + ) + ).take(), + "put negative int in natural attr fails with a proper message that explains what happened" + ).getMessage(), + Matchers.equalTo("the 'new-size' attribute (-42) must be greater or equal to zero") + ); + } + } diff --git "a/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EO\317\206Test.java" "b/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EO\317\206Test.java" index 58036596f95..310380b1a14 100644 --- "a/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EO\317\206Test.java" +++ "b/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EO\317\206Test.java" @@ -40,6 +40,9 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +// @checkstyle MissingDeprecatedCheck (10 lines) +// @checkstyle AtclauseOrderCheck (10 lines) + /** * Test case for {@link EOmalloc$EOof$EOφ}. * @@ -95,8 +98,33 @@ void throwsCorrectErrorForSizeAttrNotAnInt() { ); } + @Test + void throwsCorrectErrorForSizeAttrNotNatural() { + MatcherAssert.assertThat( + "the message in the error is correct", + Assertions.assertThrows( + ExAbstract.class, + () -> new Dataized( + new PhWith( + new EOmalloc$EOof$EOφ(), + Attr.RHO, + new PhWith( + new EOmalloc$EOof$EOφTest.SizeDummy(), + "size", + new Data.ToPhi(-42) + ) + ) + ).take(), + "put negative int in natural attr fails with a proper message that explains what happened" + ).getMessage(), + Matchers.equalTo("the 'size' attribute (-42) must be greater or equal to zero") + ); + } + /** * Dummy with size attr. + * + * @since 0.52 */ private static class SizeDummy extends PhDefault { /** diff --git a/eo-runtime/src/test/java/EOorg/EOeolang/EOmallocTest.java b/eo-runtime/src/test/java/EOorg/EOeolang/EOmallocTest.java index a48d4391f80..d5f02ddd2d4 100644 --- a/eo-runtime/src/test/java/EOorg/EOeolang/EOmallocTest.java +++ b/eo-runtime/src/test/java/EOorg/EOeolang/EOmallocTest.java @@ -159,7 +159,9 @@ void throwsCorrectErrorForOffsetAttrNaN(final Class cls) { ExAbstract.class, () -> new Dataized( new PhWith( - new PhiWithDummyId((Phi) cls.getDeclaredConstructor().newInstance()).it(), + new PhiWithIdDummy( + (Phi) cls.getDeclaredConstructor().newInstance() + ).it(), "offset", new Data.ToPhi(true) ) @@ -182,7 +184,9 @@ void throwsCorrectErrorForOffsetAttrNotAnInt(final Class cls) { ExAbstract.class, () -> new Dataized( new PhWith( - new PhiWithDummyId((Phi) cls.getDeclaredConstructor().newInstance()).it(), + new PhiWithIdDummy( + (Phi) cls.getDeclaredConstructor().newInstance() + ).it(), "offset", new Data.ToPhi(42.42) ) @@ -193,6 +197,31 @@ void throwsCorrectErrorForOffsetAttrNotAnInt(final Class cls) { ); } + @ParameterizedTest + @ValueSource(classes = { + EOmalloc$EOof$EOallocated$EOread.class, + EOmalloc$EOof$EOallocated$EOwrite.class + }) + void throwsCorrectErrorForOffsetAttrNotNatural(final Class cls) { + MatcherAssert.assertThat( + "the message in the error is correct", + Assertions.assertThrows( + ExAbstract.class, + () -> new Dataized( + new PhWith( + new PhiWithIdDummy( + (Phi) cls.getDeclaredConstructor().newInstance() + ).it(), + "offset", + new Data.ToPhi(-42) + ) + ).take(), + "put negative int in natural attr fails with a proper message that explains what happened" + ).getMessage(), + Matchers.equalTo("the 'offset' attribute (-42) must be greater or equal to zero") + ); + } + /** * Allocated data. * @param obj Init object @@ -242,9 +271,10 @@ private static class Dummy extends PhDefault { * * @since 0.52 */ - static class PhiWithDummyId { + @SuppressWarnings("PMD.ShortMethodName") + static class PhiWithIdDummy { /** - * Phi + * Phi. */ private final Phi phi; @@ -252,7 +282,7 @@ static class PhiWithDummyId { * Ctor. * @param phi Phi */ - PhiWithDummyId(Phi phi) { + PhiWithIdDummy(final Phi phi) { this.phi = phi; } @@ -262,7 +292,7 @@ static class PhiWithDummyId { */ public Phi it() { return new PhWith( - phi, + this.phi, Attr.RHO, new PhWith( new EOmallocTest.IdDummy(),