From d6c6aab236e9f95dac0dfd793133f3b7a126eebc Mon Sep 17 00:00:00 2001 From: Andrew Smirnov Date: Sun, 26 Jan 2025 18:06:27 +0300 Subject: [PATCH] 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 | 155 ++++++++++++++++++ .../java/EOorg/EOeolang/EOmallocTest.java | 67 ++++++++ 7 files changed, 235 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 9db74d99d6..ad06879da2 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 e38356e846..869a0e01a6 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 b803eb630e..fcee96e892 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 8e3d9fc515..7722c68ddf 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 cd89282645..549a6a9116 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 0000000000..a53fbbc8b5 --- /dev/null +++ b/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOreadTest.java @@ -0,0 +1,155 @@ +/* + * 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 + */ +@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 DummyGenerator().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 DummyGenerator().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 DummyGenerator().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 DummyGenerator().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 + */ + private static class DummyGenerator { + /** + * @return EOmalloc$EOof$EOallocated$EOread with id attr + */ + 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 059b77b2d1..106405d673 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 { ); } } + }