/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2024-2025. All rights reserved.
 */
package magic.tests

import magic.dsl.*
import magic.dsl.*
import magic.prelude.*
import std.collection.{ArrayList, HashMap}
import std.unittest.testmacro.PowerAssert
import std.unittest.testmacro.BeforeAll

@jsonable
private class NestedData {
    let f1: String
    let f2: Int64
    let f3: Float64
}

@jsonable
private class Data {
    let f4: Option<String>
    let f5: Array<NestedData>
    let f6: ArrayList<String>
    let f7: HashMap<String, NestedData>
}

@Test
class TestJsonable {
    @TestCase
    func test1() {
        let nest = NestedData(f1: "f1", f2: 2, f3: 0.0)
        let data = Data(
            f4: "f4",
            f5: [nest],
            f6: ArrayList<String>(["f6"]),
            f7: HashMap<String, NestedData>([("f7", nest)])
        )
        let js = data.toJsonValue().toJsonString()
        let jv = JsonValue.fromStr(js)
        let data2 = Data.fromJsonValue(jv)
        @Assert(data2.f7["f7"].f1, data.f7["f7"].f1)
        @Assert(data2.f7["f7"].f2, data.f7["f7"].f2)
        @Assert(data2.f7["f7"].f3, data.f7["f7"].f3)
    }
}