1/*
2 * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16function main(): void {
17  let a : double = 2147483649.0;    // 2^31 + 1
18  assert a as float == 2147483648;  // rounded
19  assert a as long == 2147483649;
20  assert a as int == 2147483647;    // 2^31 - 1 == MAX_INT == 0xFFFFFFFF
21  assert a as short == -1;          // 0xFFFF
22  assert a as char == c'\uFFFF';
23  assert a as byte == -1;           // 0xFF
24
25  a = -2147483649.0                 // 2^31 + 1
26  assert a as float == -2147483648; // rounded
27  assert a as long == -2147483649;
28  assert a as int == -2147483648;   // -2^31 == MIN_INT == 0x10000000
29  assert a as short == 0;
30  assert a as char == c'\u0000';
31  assert a as byte == 0;
32
33  let b : float = 70000.9921875;
34  assert b as double == 70000.9921875;
35  assert b as long == 70000;           // rounded, 70000 == 0x11170
36  assert b as int == 70000;
37  assert b as short == 4464;           // 4464 == 0x1170
38  assert b as char == c'\u1170';
39  assert b as byte == 112;             // 112 == 0x70
40
41  let c : long = 1193046;              // 1193046 == 0x123456
42  assert c as int == 1193046;
43  assert c as short == 13398;          // 13398 == 0x3456
44  assert c as char == c'\u3456';
45  assert c as byte == 86;              // 86 == 0x56
46
47  let d : int = 126977;                // 65537 == 0x1F001
48  assert d as short == -4095;          // -4095 == 0xF001
49  assert d as char == c'\uF001';
50  assert d as byte == 1;               // 1 == 0x01
51
52  let e : short = -30875;              // -30875 == 0x8765
53  assert e as double == -30875.0;
54  assert e as float == -30875.0;
55  assert e as long == -30875;          // -30875 == 0xFFFFFFFFFFFF8765
56  assert e as int == -30875;           // -30875 == 0xFFFF8765
57  assert e as char == c'\u8765';
58  assert e as byte == 101;             // 101 == 0x65
59
60  let f : char = c'\uF001';
61  assert f as double == 61441.0;
62  assert f as float == 61441.0;
63  assert f as long == 61441;            // 61441 == 0x000000000000F001
64  assert f as int == 61441;             // 61441 == 0x0000F001
65  assert f as short == 0xf001 as short; // -4095 == 0xF001
66  assert f as short == -4095;
67
68  let g : byte = -128;
69  assert g as double == -128.0;
70  assert g as float == -128.0;
71  assert g as long == -128;
72  assert g as int == -128;
73  assert g as short == -128;
74  assert g as char == c'\uFF80';
75  assert (-128) as byte == -128
76  assert (-129) as byte == 127
77
78  let i : boolean = true;
79  assert i as boolean == true;
80
81  i = false;
82  assert i as boolean == false;
83
84  assert 4294967296.0 as byte == -1;
85  assert 4294967296.0 as char == c'\uFFFF';
86  assert 4294967296.0 as short == -1;
87  assert 4294967296.0 as int == Int.MAX_VALUE;
88  assert 4294967296.0 as long == 4294967296;
89  assert -4294967296.0 as byte == 0;
90  assert -4294967296.0 as char == c'\u0000';
91  assert -4294967296.0 as short == 0;
92  assert -4294967296.0 as int == Int.MIN_VALUE;
93  assert -4294967296.0 as long == -4294967296;
94
95  return;
96}
97