// Test file for Pony syntax highlighting, released under MIT License

primitive Red fun apply(): U32 => 0xFFFF0000

primitive Colours
fun black(): U32 => 0xFF000000
fun red(): U32 => 0xFFFF0000

primitive Black
primitive Blue

type Colour is (Black | Blue )

primitive ColourList
fun tag apply(): Array[Colour] =>
[Black; Blue]

for colour in ColourList().values() do
end

type EGLEvent is (U8, F32, F32)
(var code, var x, var y) = @getEvent[EGLEvent]()

primitive _XDisplayHandle
primitive _EGLDisplayHandle

let x_dpy = @XOpenDisplay[Pointer[_XDisplayHandle]](U32(0))
if x_dpy.is_null() then
env.out.print("XOpenDisplay failed")
end

let e_dpy = @eglGetDisplay[Pointer[_EGLDisplayHandle]](x_dpy)
if e_dpy.is_null() then
env.out.print("eglGetDisplay failed")
end

primitive _EGLConfigHandle
let a = Array[U16](8)
a.push(0x3040)
a.push(0b01011)
let config = Pointer[_EGLConfigHandle]
if @eglChooseConfig[U32](e_dpy, a, config, U32(1), Pointer[U32]) == 0 then
env.out.print("eglChooseConfig failed")
end


actor Main
new create(env: Env) =>
// The no of arguments
env.out.print(env.args.size().string())
for value in env.args.values() do
env.out.print(value)
end
// Access the arguments the first one will always be the the appication name
try env.out.print(env.args(0)?) end

actor Main
new create(env: Env) =>
var options = Options(env)

options
.add("output", "o", StringArgument)

env.out.print(options.has_argument())

for option in options do
match option
| ("output", var arg: String) => _outputFileName = arg.string()
| let err: ParseError =>
err.report(env.out)
env.out.print(
"""
pony-embed [OPTIONS]
--output name string output filename.
"""
)
end
end

use "ponytest"

actor Main is TestList
new create(env: Env) => PonyTest(env, this)
new make() => None

fun tag tests(test: PonyTest) =>
test(_TestAddition)

class iso _TestAddition is UnitTest
"""
Adding 2 numbers
"""
fun name(): String => "u32/add"

fun apply(h: TestHelper): TestResult =>
h.expect_eq[U32](2 + 2, 4)

fun tag log(msg: String, verbose: Bool = false)
be fail() =>
be assert_failed(msg: String) =>
fun tag assert_true(actual: Bool, msg: String = "") ?
fun tag expect_true(actual: Bool, msg: String = ""): Bool
fun tag expect_eq[A: (Equatable[A] #read & Stringable)]
(expect: A, actual: A, msg: String = ""): Bool
fun tag expect_eq[A: (Equatable[A] #unknown & Stringable)]
(expect: A, actual: A, msg: String = ""): Bool

fun add(other: A): A
fun sub(other: A): A
fun mul(other: A): A
fun div(other: A): A
fun mod(other: A): A
fun eq(other: A): Bool
fun ne(other: A): Bool
fun lt(other: A): Bool
fun le(other: A): Bool
fun ge(other: A): Bool
fun gt(other: A): Bool
fun shl(other: A): A
fun shr(other: A): A
fun op_and(other:A): A
fun op_or(other: A): A
fun op_xor(othr: A): A

class Test
fun alpha() =>
"""
"""

let dice: Array[U32] = [1; 2; 3
4
5
6
]

actor Main
fun foo(n:U32): {ref(U32): U32} =>
var s: Array[U32] = Array[U32].init(n, 1)
{ref(i:U32)(s): U32 =>
try
s(0) = s(0) + i
s(0)
else
0
end
}

new create(env:Env) =>
var f = foo(5)
env.out.print(f(10).string())
env.out.print(f(20).string())

/* nested /* commentary */ */
// single comment

class A
class _A
x'
x''
x'.string()
'\uaaaa'
'\Ubbbbbb'
'\xcc'
'\''
'\n'
"\uaaaaa"
"\Ubbbbbbb"
"\xccc"
"\""
"\n"
34.4
34.4e43
43e4
0x3040
0xaF
0b01
3_43_4
0x0_4

fun create(): U32 => 0
fun iso create(): U32 => 0
fun \\ abc \\ iso create(): U32 => 0
class \\ packet, blah \\ iso Xyz
if \\ likely \\ a then
end

a.endnormal

print();print()

/* syntactically false: */

class _aA
class _a
class a
0b2332
0b
0x
0xgf
0f00
3.
.3
3.e3
3_
3__43_4
''
'\u'
'\ua'
'\uaaa'
'\uaaaaa'
'\uyyyy'
"\u"
"\ua"
"\uaaa"
"\uyyyy"
a'a

class badType
print();