summaryrefslogtreecommitdiff
path: root/akono/src/androidTest/java/akono/InstrumentedAkonoTests.kt
blob: beda511925449ad385e20120b5b4530d8a244895 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package akono.test;

import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.runner.RunWith
import org.junit.Test
import androidx.test.filters.LargeTest
import org.junit.Assert.assertEquals
import akono.AkonoJni
import akono.ModuleResult
import android.util.Log
import java.util.concurrent.LinkedBlockingDeque


class SyncMessageHandler : AkonoJni.MessageHandler {
    private val messageQueue = LinkedBlockingDeque<String>()
    override fun handleMessage(message: String) {
        messageQueue.put(message)
    }

    fun waitForMessage(): String {
        return messageQueue.take()
    }
}


class StaticModuleLoadHandler : AkonoJni.LoadModuleHandler {
    private val modules: MutableMap<String, String> = HashMap()

    override fun loadModule(name: String, paths: Array<String>): ModuleResult? {
        val code = modules.get(name) ?: return null
        if (modules.containsKey(name)) {
            return ModuleResult("/vmodroot/$name.js", code)
        }
        return null
    }

    fun registerModule(name: String, source: String) {
        modules[name] = source
    }
}


// @RunWith is required only if you use a mix of JUnit3 and JUnit4.
@RunWith(AndroidJUnit4::class)
@LargeTest
public class InstrumentedAkonoTestOne {
    @Test
    fun myJsTest() {
        val ajni: AkonoJni = AkonoJni()
        assertEquals("2", ajni.evalSimpleJs("1+1"))
        assertEquals("36", ajni.evalSimpleJs("6*6"))
        assertEquals("42", ajni.evalSimpleJs("(()=>{let x = 42; return x;})()"))
        assertEquals("undefined", ajni.evalSimpleJs("const myVal = 42"))
        assertEquals("43", ajni.evalSimpleJs("myVal + 1"))

        val myHandler = SyncMessageHandler()
        ajni.setMessageHandler(myHandler)
        ajni.evalNodeCode("console.log('hi from the test case')")
        // Tell the message handler to just ping back messages to us
        ajni.evalNodeCode("global.__akono_onMessage = (x) => { global.__akono_sendMessage(x); }")
        val sentMessage = "Hello AKONO!!"
        ajni.sendMessage(sentMessage)
        val receivedMessage = myHandler.waitForMessage()
        assertEquals(sentMessage, receivedMessage)
        Log.i("myapp", "test case received message: $receivedMessage")

        val myModHandler = StaticModuleLoadHandler()

        ajni.setLoadModuleHandler(myModHandler)

        myModHandler.registerModule("a", """
            |console.log('I am module a');
            |exports.foo = () => { global.__akono_sendMessage('hello42'); };
        """.trimMargin())

        ajni.evalNodeCode("a = require('a');")
        ajni.evalNodeCode("a.foo()")

        val msg2 = myHandler.waitForMessage()

        assertEquals("hello42", msg2)

        ajni.waitStopped()
    }
}