From b5ce026145f10d15876929f82de8baf44f750404 Mon Sep 17 00:00:00 2001 From: Anton Soldatov Date: Fri, 20 Oct 2023 11:53:47 +0300 Subject: [PATCH] Add draft tests for undefined Signed-off-by: Anton Soldatov --- .../09.undefined_type/draft.ets | 275 ++++++++++++++++++ 1 file changed, 275 insertions(+) create mode 100644 plugins/ets/tests/ets-templates/03.types/08.reference_types/09.undefined_type/draft.ets diff --git a/plugins/ets/tests/ets-templates/03.types/08.reference_types/09.undefined_type/draft.ets b/plugins/ets/tests/ets-templates/03.types/08.reference_types/09.undefined_type/draft.ets new file mode 100644 index 000000000..718e9ccc3 --- /dev/null +++ b/plugins/ets/tests/ets-templates/03.types/08.reference_types/09.undefined_type/draft.ets @@ -0,0 +1,275 @@ +let assert = function(b : boolean) : void { + if (!b) { + throw(new Error("Assertion failed")) + } +} + +let undefined : undefined = undefined // CTE + +assert(undefined !== null) +assert(null !== undefined) + +let v01 : undefined = undefined +let v02 : undefined = null // CTE +let v03 : undefined = 1 // CTE +let v04 : undefined = "string" // CTE +let v05 : undefined = true // CTE +let v06 : undefined = new Object() // CTE +let v07 = undefined +assert(v01 === undefined) +assert(v07 === undefined) +assert(typeof(v01) === "undefined") +assert(typeof(v07) === "undefined") + +let arr01 = new Array() +arr01.push(undefined) +assert(arr01[0] === undefined) + +let arr02 = new Array() +arr02.push(null) // CTE + +let arr03 = new Array() +arr03.push(1) // CTE + +let arr04 = new Array() +arr04.push("string") // CTE + +let arr05 = new Array() +arr05.push(true) // CTE + +let arr06 = new Array() +arr06.push(new Object()) // CTE + +let set01 = new Set() +set01.add(undefined) +assert(set01.has(undefined)) + +let set02 = new Set() +set02.add(null) // CTE + +let set03 = new Set() +set03.add(1) // CTE + +let set04 = new Set() +arr04.push("string") // CTE + +let set05 = new Set() +set05.add(true) // CTE + +let set06 = new Set() +set06.add(new Object()) // CTE + + +class C01 extends undefined { // CTE + +} + +class C02 implements undefined { // CTE + +} + +class C03 { + n : number | undefined +} +let v08 = new C03() +assert(v08.n === undefined) + +class C04 { + n ?: number +} +let v09 = new C04() +assert(v09.n === undefined) + +class C05 { + n : number | undefined = undefined +} +let v10 = new C05() +assert(v10.n === undefined) + +class C06 { + n : number | undefined = 42 +} +let v11 = new C06() +assert(v11.n === 42) +v11.n = undefined +assert(v11.n === undefined) + +class C07 { + n ?: number = 42 +} +let v12 = new C07() +assert(v12.n === 42) +v12.n = undefined +assert(v12.n === undefined) + +class C08 { + n: number +} +class C09 { + c08 ?: C08 +} +let v13 = new C09() +assert(v13.c08.n === undefined) // CTE +assert(v13.c08?.n === undefined) +assert(v13.c08!.n === undefined) + +let arr07 : Array = [new Object(), undefined] +assert(arr07[0].toString().length > 0) // CTE +assert(arr07[0]?.toString().length !== undefined) +assert(arr07[1]?.toString().length === undefined) + +function fn01(a : Array) { + assert(a.length === 0) +} +fn01(new Array()) // CTE +fn01(new Array()) // CTE +fn01(new Array()) + +function fn02(a : Array) { + assert(a.length === 0) +} +fn02(new Array()) +fn02(new Array()) +fn02(new Array()) + +class C10 { + n : number | undefined +} + +function fn03(a : Array | undefined) { + assert(a !== undefined) + assert(a?.length !== undefined) + assert(a!.length > 0) + assert(a!.length === 1) + assert(a?.length === 1) + + assert(a[0].n! > 0) // CTE + assert(a[0].n! === 42) // CTE + assert(a![0].n > 0) // CTE + assert(a![0].n === 42) + + assert(a![0].n! > 0) + assert(a![0].n! === 42) +} +fn03([{n: 42}]) +fn03([{n: 42} as C10]) + +function fn04(a : Array) { + assert(a?.length !== undefined) + assert(a.length === 2) + assert(a!.length > 0) + assert(a!.length === 2) + assert(a?.length === 2) + + assert(a[0].n! > 0) // CTE + assert(a[0].n! === 42) // CTE + assert(a[0]!.n > 0) // CTE + assert(a[0]!.n === 42) + + assert(a[0]!.n! > 0) + assert(a[0]!.n! === 42) +} +fn04([{n: 42} , undefined]) +fn04([{n: 42} as C10, undefined]) +fn04(undefined) // CTE + +function fn05(a : Array | undefined) { + assert(a?.length !== undefined) + assert(a.length === 2) // CTE + assert(a!.length > 0) + assert(a!.length === 2) + assert(a?.length === 2) + + assert(a[0].n! > 0) // CTE + assert(a[0].n! === 42) // CTE + assert(a[0]!.n > 0) // CTE + assert(a[0]!.n === 42) // CTE + assert(a![0].n === 42) // CTE + assert(a![0]!.n! === 42) + + assert(a[0]!.n! > 0) // CTE + assert(a[0]!.n! === 42) // CTE +} +fn05([{n: 42} , undefined]) +fn05([{n: 42} as C10, undefined]) +fn05(null) // CTE + +function fn06(a : Array | undefined) { + assert((a ?? "wow") !== "wow") + assert((a![0] ?? "wow") !== "wow") + assert((a![0]!.n ?? "wow") !== "wow") + let b = a ?? "wow" + assert(b.length === 1) +} +fn06([{n: 42}]) +fn06([{n: 42} as C10]) + +function fn07(a : Array) { + assert(a[0] !== undefined) +} +fn07([{n: 42}, undefined]) // CTE +fn07([{n: 42} as C10, undefined]) // infers: fn07(...) +fn07([{n: 42} as C10, undefined]) + +class C11 { + n : number | undefined | null = null + s : string | undefined | null = null +} + +type T_ = C11 | undefined | null +type T = Array | Array | Array | Array | T_ + +function fn08(p : T) : T { + if (p === undefined) + return null + + if (p === null) + return undefined + + if (p instanceof C11) + return { n: p.s?.length, s: p.n?.toString() } + + if (p instanceof Array) { + let tmp = p[0] + if (tmp === null) + return null + if (tmp === undefined) + return undefined + if (tmp instanceof C11) + return [null, undefined, new C11(), {n: null, s: undefined}] + } + + return new Array() +} + +assert(fn08(undefined) === null) +assert(fn08(null) === undefined) +assert(fn08(fn08(undefined)) === fn08(null)) + +// assert(fn08({n: 42, s: "42"}) instanceof C11) // runtime: false (TS), true (ArkTS) + +let v14 = new C11() +v14.n = 10101 +v14.s = "42" +assert((fn08(v14) as C11).n === 2) +assert((fn08(v14) as C11).s === "10101") + +let arr08 = new Array() + +arr08.push(null) + assert(fn08(arr08) === arr08[0] && arr08[0] !== undefined) +arr08.pop() + +arr08.push(undefined) + assert(fn08(arr08) === arr08[0] && arr08[0] !== null) +arr08.pop() + +arr08.push(new C11()) + assert((fn08(arr08) as Array).length === 4) + assert((fn08(arr08) as Array)[3]!.n === null) + assert((fn08(arr08) as Array)[3]!.s === undefined) + assert((fn08(arr08) as Array)[3]!.n === (fn08(arr08) as Array)[0]) + assert((fn08(arr08) as Array)[3]!.s === (fn08(arr08) as Array)[1]) + assert((fn08(arr08) as Array)[2] instanceof C11) +arr08.pop() + -- Gitee