move docs to docs/ folder, merge architecture files, update references
This commit is contained in:
BIN
test-apps/com.mosis.sandbox-test.mosis
Normal file
BIN
test-apps/com.mosis.sandbox-test.mosis
Normal file
Binary file not shown.
195
test-apps/com.mosis.sandbox-test/app.lua
Normal file
195
test-apps/com.mosis.sandbox-test/app.lua
Normal file
@@ -0,0 +1,195 @@
|
||||
-- Sandbox Test App
|
||||
-- Tests: timers, JSON, crypto, storage
|
||||
|
||||
local results = {}
|
||||
|
||||
local function log(msg)
|
||||
table.insert(results, os.date("%H:%M:%S") .. " " .. msg)
|
||||
local el = document:GetElementById("results")
|
||||
if el then
|
||||
el.inner_rml = table.concat(results, "\n")
|
||||
end
|
||||
end
|
||||
|
||||
local function setStatus(id, status, success)
|
||||
local el = document:GetElementById(id)
|
||||
if el then
|
||||
if success then
|
||||
el.inner_rml = "✓ " .. status
|
||||
else
|
||||
el.inner_rml = "✗ " .. status
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Timer test
|
||||
function testTimer()
|
||||
setStatus("timer-status", "Running...", true)
|
||||
log("Starting timer test...")
|
||||
|
||||
local count = 0
|
||||
local timerId = nil
|
||||
|
||||
timerId = setInterval(function()
|
||||
count = count + 1
|
||||
log("Timer tick: " .. count)
|
||||
|
||||
if count >= 3 then
|
||||
clearInterval(timerId)
|
||||
setStatus("timer-status", "Passed (3 ticks)", true)
|
||||
log("Timer test complete!")
|
||||
end
|
||||
end, 1000)
|
||||
|
||||
log("Timer started with ID: " .. tostring(timerId))
|
||||
end
|
||||
|
||||
-- JSON test
|
||||
function testJSON()
|
||||
log("Starting JSON test...")
|
||||
|
||||
local success = true
|
||||
local msg = ""
|
||||
|
||||
-- Test encode
|
||||
local data = {
|
||||
name = "test",
|
||||
value = 42,
|
||||
nested = { a = 1, b = 2 }
|
||||
}
|
||||
|
||||
local encoded = json.encode(data)
|
||||
if encoded then
|
||||
log("Encoded: " .. encoded)
|
||||
else
|
||||
success = false
|
||||
msg = "encode failed"
|
||||
end
|
||||
|
||||
-- Test decode
|
||||
if success then
|
||||
local decoded = json.decode(encoded)
|
||||
if decoded and decoded.name == "test" and decoded.value == 42 then
|
||||
log("Decoded successfully, name=" .. decoded.name)
|
||||
else
|
||||
success = false
|
||||
msg = "decode failed"
|
||||
end
|
||||
end
|
||||
|
||||
if success then
|
||||
setStatus("json-status", "Passed", true)
|
||||
log("JSON test complete!")
|
||||
else
|
||||
setStatus("json-status", "Failed: " .. msg, false)
|
||||
end
|
||||
end
|
||||
|
||||
-- Crypto test
|
||||
function testCrypto()
|
||||
log("Starting crypto test...")
|
||||
|
||||
local success = true
|
||||
local msg = ""
|
||||
|
||||
-- Test random bytes
|
||||
local bytes = crypto.randomBytes(16)
|
||||
if bytes and #bytes == 16 then
|
||||
log("Random bytes (hex): " .. bytes:gsub(".", function(c)
|
||||
return string.format("%02x", c:byte())
|
||||
end))
|
||||
else
|
||||
success = false
|
||||
msg = "randomBytes failed"
|
||||
end
|
||||
|
||||
-- Test SHA256
|
||||
if success then
|
||||
local hash = crypto.sha256("hello world")
|
||||
if hash then
|
||||
log("SHA256: " .. hash:sub(1, 32) .. "...")
|
||||
else
|
||||
success = false
|
||||
msg = "sha256 failed"
|
||||
end
|
||||
end
|
||||
|
||||
-- Test HMAC
|
||||
if success then
|
||||
local hmac = crypto.hmac("sha256", "secret", "message")
|
||||
if hmac then
|
||||
log("HMAC: " .. hmac:sub(1, 32) .. "...")
|
||||
else
|
||||
success = false
|
||||
msg = "hmac failed"
|
||||
end
|
||||
end
|
||||
|
||||
if success then
|
||||
setStatus("crypto-status", "Passed", true)
|
||||
log("Crypto test complete!")
|
||||
else
|
||||
setStatus("crypto-status", "Failed: " .. msg, false)
|
||||
end
|
||||
end
|
||||
|
||||
-- Storage test
|
||||
function testStorage()
|
||||
log("Starting storage test...")
|
||||
|
||||
local success = true
|
||||
local msg = ""
|
||||
|
||||
-- Test write
|
||||
local writeOk = fs.write("test.txt", "Hello from sandbox!")
|
||||
if writeOk then
|
||||
log("Write successful")
|
||||
else
|
||||
success = false
|
||||
msg = "write failed"
|
||||
end
|
||||
|
||||
-- Test read
|
||||
if success then
|
||||
local content = fs.read("test.txt")
|
||||
if content == "Hello from sandbox!" then
|
||||
log("Read successful: " .. content)
|
||||
else
|
||||
success = false
|
||||
msg = "read mismatch"
|
||||
end
|
||||
end
|
||||
|
||||
-- Test list
|
||||
if success then
|
||||
local files = fs.list("/")
|
||||
if files then
|
||||
log("Files in root: " .. #files)
|
||||
for _, f in ipairs(files) do
|
||||
log(" - " .. f)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Test delete
|
||||
if success then
|
||||
local deleteOk = fs.delete("test.txt")
|
||||
if deleteOk then
|
||||
log("Delete successful")
|
||||
else
|
||||
success = false
|
||||
msg = "delete failed"
|
||||
end
|
||||
end
|
||||
|
||||
if success then
|
||||
setStatus("storage-status", "Passed", true)
|
||||
log("Storage test complete!")
|
||||
else
|
||||
setStatus("storage-status", "Failed: " .. msg, false)
|
||||
end
|
||||
end
|
||||
|
||||
-- Initialize
|
||||
log("Sandbox Test App loaded")
|
||||
log("Lua version: " .. (_VERSION or "unknown"))
|
||||
46
test-apps/com.mosis.sandbox-test/main.rml
Normal file
46
test-apps/com.mosis.sandbox-test/main.rml
Normal file
@@ -0,0 +1,46 @@
|
||||
<rml>
|
||||
<head>
|
||||
<title>Sandbox Test</title>
|
||||
<link type="text/rcss" href="styles.rcss"/>
|
||||
<script src="app.lua"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="app-bar">
|
||||
<div class="app-bar-nav btn-icon" onclick="goBack()">
|
||||
<span class="icon">←</span>
|
||||
</div>
|
||||
<div class="app-bar-title">Sandbox Test</div>
|
||||
</div>
|
||||
|
||||
<div class="content">
|
||||
<div class="card">
|
||||
<div class="card-title">Timer Test</div>
|
||||
<div id="timer-status">Not started</div>
|
||||
<button onclick="testTimer()">Start Timer</button>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">JSON Test</div>
|
||||
<div id="json-status">Not tested</div>
|
||||
<button onclick="testJSON()">Test JSON</button>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">Crypto Test</div>
|
||||
<div id="crypto-status">Not tested</div>
|
||||
<button onclick="testCrypto()">Test Crypto</button>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">Storage Test</div>
|
||||
<div id="storage-status">Not tested</div>
|
||||
<button onclick="testStorage()">Test Storage</button>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">Results</div>
|
||||
<div id="results">Click buttons above to run tests</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</rml>
|
||||
18
test-apps/com.mosis.sandbox-test/manifest.json
Normal file
18
test-apps/com.mosis.sandbox-test/manifest.json
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "com.mosis.sandbox-test",
|
||||
"name": "Sandbox Test",
|
||||
"version": "1.0.0",
|
||||
"version_code": 1,
|
||||
"entry": "main.rml",
|
||||
"icon": "icon.tga",
|
||||
"description": "Tests sandbox APIs: timers, storage, JSON, crypto",
|
||||
"developer": {
|
||||
"name": "Mosis Team",
|
||||
"email": "dev@mosis.dev"
|
||||
},
|
||||
"permissions": [
|
||||
"storage",
|
||||
"network"
|
||||
],
|
||||
"min_api_version": 1
|
||||
}
|
||||
85
test-apps/com.mosis.sandbox-test/styles.rcss
Normal file
85
test-apps/com.mosis.sandbox-test/styles.rcss
Normal file
@@ -0,0 +1,85 @@
|
||||
body {
|
||||
font-family: LatoLatin;
|
||||
font-size: 16dp;
|
||||
background-color: #121212;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.app-bar {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
height: 56dp;
|
||||
background-color: #1e1e1e;
|
||||
padding: 0 8dp;
|
||||
}
|
||||
|
||||
.app-bar-nav {
|
||||
width: 40dp;
|
||||
height: 40dp;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: 20dp;
|
||||
}
|
||||
|
||||
.app-bar-nav:hover {
|
||||
background-color: #333333;
|
||||
}
|
||||
|
||||
.icon {
|
||||
font-size: 24dp;
|
||||
}
|
||||
|
||||
.app-bar-title {
|
||||
font-size: 20dp;
|
||||
font-weight: bold;
|
||||
margin-left: 16dp;
|
||||
}
|
||||
|
||||
.content {
|
||||
padding: 16dp;
|
||||
}
|
||||
|
||||
.card {
|
||||
background-color: #1e1e1e;
|
||||
border-radius: 12dp;
|
||||
padding: 16dp;
|
||||
margin-bottom: 12dp;
|
||||
}
|
||||
|
||||
.card-title {
|
||||
font-size: 18dp;
|
||||
font-weight: bold;
|
||||
margin-bottom: 8dp;
|
||||
color: #bb86fc;
|
||||
}
|
||||
|
||||
button {
|
||||
background-color: #bb86fc;
|
||||
color: #000000;
|
||||
border: none;
|
||||
border-radius: 8dp;
|
||||
padding: 12dp 24dp;
|
||||
font-size: 14dp;
|
||||
font-weight: bold;
|
||||
margin-top: 8dp;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background-color: #cf9fff;
|
||||
}
|
||||
|
||||
button:active {
|
||||
background-color: #9a67ea;
|
||||
}
|
||||
|
||||
#results {
|
||||
font-family: monospace;
|
||||
font-size: 12dp;
|
||||
background-color: #0d0d0d;
|
||||
padding: 12dp;
|
||||
border-radius: 8dp;
|
||||
white-space: pre-wrap;
|
||||
color: #00ff00;
|
||||
}
|
||||
21
test-apps/package.bat
Normal file
21
test-apps/package.bat
Normal file
@@ -0,0 +1,21 @@
|
||||
@echo off
|
||||
REM Package test apps as .mosis files
|
||||
|
||||
setlocal enabledelayedexpansion
|
||||
|
||||
for /d %%d in (*) do (
|
||||
if exist "%%d\manifest.json" (
|
||||
echo Packaging %%d...
|
||||
cd %%d
|
||||
if exist "..\%%d.mosis" del "..\%%d.mosis"
|
||||
tar -a -cf "..\%%d.mosis" *
|
||||
cd ..
|
||||
echo Created %%d.mosis
|
||||
)
|
||||
)
|
||||
|
||||
echo.
|
||||
echo Done! Package files:
|
||||
dir /b *.mosis 2>nul
|
||||
|
||||
endlocal
|
||||
Reference in New Issue
Block a user