From 62525e08e9799378efec2afcd49347974b06e478 Mon Sep 17 00:00:00 2001 From: Victor Date: Sat, 5 Jan 2019 23:09:35 +0200 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=B5=20=D1=84?= =?UTF-8?q?=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B9=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/annimon/ownlang/lib/Converters.java | 8 +++++ .../com/annimon/ownlang/lib/StringValue.java | 32 +++++++++++++++-- src/test/resources/other/stringFunctions.own | 35 +++++++++++++++++++ 3 files changed, 73 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/annimon/ownlang/lib/Converters.java b/src/main/java/com/annimon/ownlang/lib/Converters.java index fbef1d5..51afbc9 100644 --- a/src/main/java/com/annimon/ownlang/lib/Converters.java +++ b/src/main/java/com/annimon/ownlang/lib/Converters.java @@ -1,5 +1,6 @@ package com.annimon.ownlang.lib; +import java.util.function.Predicate; import static com.annimon.ownlang.lib.ValueUtils.getFloatNumber; /** @@ -192,4 +193,11 @@ public final class Converters { return NumberValue.ZERO; }); } + + public static FunctionValue stringToBoolean(Predicate f) { + return new FunctionValue(args -> { + Arguments.check(1, args.length); + return NumberValue.fromBoolean(f.test(args[0].asString())); + }); + } } diff --git a/src/main/java/com/annimon/ownlang/lib/StringValue.java b/src/main/java/com/annimon/ownlang/lib/StringValue.java index 2f52da8..91ca490 100644 --- a/src/main/java/com/annimon/ownlang/lib/StringValue.java +++ b/src/main/java/com/annimon/ownlang/lib/StringValue.java @@ -23,10 +23,38 @@ public final class StringValue implements Value { // Properties case "length": return NumberValue.of(length()); + case "lower": + return new StringValue(value.toLowerCase()); + case "upper": + return new StringValue(value.toUpperCase()); + case "chars": { + final Value[] chars = new Value[length()]; + int i = 0; + for (char ch : value.toCharArray()) { + chars[i++] = NumberValue.of((int) ch); + } + return new ArrayValue(chars); + } // Functions case "trim": - return new FunctionValue(args -> new StringValue(value.trim())); + return Converters.voidToString(value::trim); + case "startsWith": + return new FunctionValue(args -> { + Arguments.checkOrOr(1, 2, args.length); + int offset = (args.length == 2) ? args[1].asInt() : 0; + return NumberValue.fromBoolean(value.startsWith(args[0].asString(), offset)); + }); + case "endsWith": + return Converters.stringToBoolean(value::endsWith); + case "matches": + return Converters.stringToBoolean(value::matches); + case "contains": + return Converters.stringToBoolean(value::contains); + case "equalsIgnoreCase": + return Converters.stringToBoolean(value::equalsIgnoreCase); + case "isEmpty": + return Converters.voidToBoolean(value::isEmpty); default: if (Functions.isExists(prop)) { @@ -42,7 +70,7 @@ public final class StringValue implements Value { } throw new UnknownPropertyException(prop); } - + public int length() { return value.length(); } diff --git a/src/test/resources/other/stringFunctions.own b/src/test/resources/other/stringFunctions.own index 3e2386e..7e0e60a 100644 --- a/src/test/resources/other/stringFunctions.own +++ b/src/test/resources/other/stringFunctions.own @@ -9,6 +9,41 @@ def testTrim() { assertEquals("test", s.trim()) } +def testLower() { + s = "TeST" + assertEquals("test", s.lower) +} + +def testUpper() { + s = "Test" + assertEquals("TEST", s.upper) +} + +def testChars() { + assertEquals([49, 50, 51, 52], "1234".chars) +} + +def testStartsWith() { + s = "test" + assertTrue(s.startsWith("tes")) + assertTrue(s.startsWith("t")) + assertFalse(s.startsWith("s")) +} + +def testEndsWith() { + s = "test" + assertTrue(s.endsWith("st")) + assertTrue(s.endsWith("t")) + assertFalse(s.endsWith("s")) +} + +def testIsEmpty() { + assertFalse(" ".isEmpty()) + assertTrue(" ".trim().isEmpty()) + assertFalse("1234".isEmpty()) + assertTrue("".isEmpty()) +} + def testExtensionFunction() { use "std" s = "1es1"