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..460d625aed --- /dev/null +++ b/eo-runtime/src/test/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOreadTest.java @@ -0,0 +1,138 @@ +package EOorg.EOeolang; + + +import org.eolang.Attr; +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$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 PhWith( + new EOmalloc$EOof$EOallocated$EOread(), + Attr.RHO, + new PhWith( + new IdDummy(), + "id", + new Data.ToPhi(42) + ) + ), + "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 PhWith( + new EOmalloc$EOof$EOallocated$EOread(), + Attr.RHO, + new PhWith( + new IdDummy(), + "id", + new Data.ToPhi(42) + ) + ), + "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 PhWith( + new EOmalloc$EOof$EOallocated$EOread(), + Attr.RHO, + new PhWith( + new IdDummy(), + "id", + new Data.ToPhi(42) + ) + ), + "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 PhWith( + new EOmalloc$EOof$EOallocated$EOread(), + Attr.RHO, + new PhWith( + new IdDummy(), + "id", + new Data.ToPhi(42) + ) + ), + "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") + ); + } + +} \ No newline at end of file diff --git a/eo-runtime/src/test/java/EOorg/EOeolang/EOmallocTest.java b/eo-runtime/src/test/java/EOorg/EOeolang/EOmallocTest.java index 059b77b2d1..729aa5b903 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}. @@ -98,6 +102,58 @@ private static Phi allocated(final Phi obj, final Phi dummy) { return malloc; } + @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 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 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") + ); + } + /** * Dummy. * @since 0.37.0 @@ -164,4 +220,5 @@ private static class ErrorDummy extends PhDefault { ); } } + } diff --git a/eo-runtime/src/test/java/EOorg/EOeolang/IdDummy.java b/eo-runtime/src/test/java/EOorg/EOeolang/IdDummy.java new file mode 100644 index 0000000000..a43f67c090 --- /dev/null +++ b/eo-runtime/src/test/java/EOorg/EOeolang/IdDummy.java @@ -0,0 +1,17 @@ +package EOorg.EOeolang; + +import org.eolang.AtVoid; +import org.eolang.PhDefault; + +/** + * Dummy with id attr. + * @since 0.51.2 + */ +final class IdDummy extends PhDefault { + /** + * Ctor. + */ + IdDummy() { + this.add("id", new AtVoid("id")); + } +}