From 20a00380edb5acf0df90c26bbdaef6e7449a9ef4 Mon Sep 17 00:00:00 2001 From: seven332 Date: Sun, 7 Nov 2021 04:57:38 +0800 Subject: [PATCH] Add registerMapAdapter test --- .../quickjs/android/TypeAdapterTest.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/library/src/androidTest/java/com/hippo/quickjs/android/TypeAdapterTest.java b/library/src/androidTest/java/com/hippo/quickjs/android/TypeAdapterTest.java index 0da99df..a430108 100644 --- a/library/src/androidTest/java/com/hippo/quickjs/android/TypeAdapterTest.java +++ b/library/src/androidTest/java/com/hippo/quickjs/android/TypeAdapterTest.java @@ -20,10 +20,13 @@ import org.junit.Test; import java.lang.reflect.Type; +import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import static org.junit.Assert.assertEquals; +import android.util.ArrayMap; + public class TypeAdapterTest { @Test @@ -68,4 +71,55 @@ public TypeAdapter create(QuickJS quickJS, Type type) { return null; } } + + @Test + public void registerMapAdapter() { + Type mapType = new JavaType>() {}.type; + + QuickJS quickJS = new QuickJS.Builder() + .registerTypeAdapter(mapType, new MapTypeAdapter().nullable()) + .build(); + try (JSRuntime runtime = quickJS.createJSRuntime()) { + try (JSContext context = runtime.createJSContext()) { + Map actual = context.evaluate( + "a = { key1: \"value1\", key2: \"value2\" }", "test.js", mapType); + Map expected = new ArrayMap<>(); + expected.put("key1", "value1"); + expected.put("key2", "value2"); + assertEquals(expected, actual); + } + } + } + + private static class MapTypeAdapter extends TypeAdapter> { + @Override + public JSValue toJSValue(JSContext context, Map value) { + JSObject jo = context.createJSObject(); + value.forEach((k, v) -> { + if (k == null) return; + jo.setProperty(k, context.createJSString(v)); + }); + return jo; + } + + @Override + public Map fromJSValue(JSContext context, JSValue value) { + JSObject jo = value.cast(JSObject.class); + JSFunction keysFunction = context.getGlobalObject() + .getProperty("Object").cast(JSObject.class) + .getProperty("keys").cast(JSFunction.class); + + TypeAdapter adapter = context.quickJS.getAdapter(String[].class); + JSValue keysResult = keysFunction.invoke(null, new JSValue[] { jo }); + String[] keys = adapter.fromJSValue(context, keysResult); + + Map map = new ArrayMap<>(keys.length); + for (String key: keys) { + String val = jo.getProperty(key).cast(JSString.class).getString(); + map.put(key, val); + } + + return map; + } + } }