1/*
2 * Copyright (c) 2021-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 test_signed_right_shift_int(): void
17{
18    let tests: int[][] = [
19                          [0x7FFFFFFF,   0, 0x7FFFFFFF],
20                          [0x7FFFFFFF,  32, 0x7FFFFFFF],
21                          [0x7FFFFFFF, -32, 0x7FFFFFFF],
22                          [0x7FFFFFFF,   1, 0x3FFFFFFF],
23                          [0x7FFFFFFF,  33, 0x3FFFFFFF],
24                          [0x7FFFFFFF,  30, 1],
25                          [0x7FFFFFFF,  62, 1],
26                          [0x7FFFFFFF,  31, 0],
27                          [0x7FFFFFFF,  63, 0],
28                          [0x7FFFFFFF,  -1, 0],
29                          [-1,  0, -1],
30                          [-1,  1, -1],
31                          [-1, 31, -1],
32                          [-4,  0, -4],
33                          [-4,  1, -2],
34                          [-4, 31, -1],
35                         ];
36
37    // runtime tests
38    for (let i: int = 0; i<tests.length; i++)
39    {
40        assert (tests[i][0] >> tests[i][1] == tests[i][2])
41    }
42
43    // compile time tests
44    assert(0x7FFFFFFF >>   0 == 0x7FFFFFFF);
45    assert(0x7FFFFFFF >>  32 == 0x7FFFFFFF);
46    assert(0x7FFFFFFF >> -32 == 0x7FFFFFFF);
47    assert(0x7FFFFFFF >>   1 == 0x3FFFFFFF);
48    assert(0x7FFFFFFF >>  33 == 0x3FFFFFFF);
49    assert(0x7FFFFFFF >>  30 == 1);
50    assert(0x7FFFFFFF >>  62 == 1);
51    assert(0x7FFFFFFF >>  31 == 0);
52    assert(0x7FFFFFFF >>  63 == 0);
53    assert(0x7FFFFFFF >>  -1 == 0);
54    assert(-1 >>  0 == -1);
55    assert(-1 >>  1 == -1);
56    assert(-1 >> 31 == -1);
57    assert(-4 >>  0 == -4);
58    assert(-4 >>  1 == -2);
59    assert(-4 >> 31 == -1);
60}
61
62function test_signed_right_shift_long(): void
63{
64    let tests: long[][] = [
65                          [0x7FFFFFFFFFFFFFFF,    0, 0x7FFFFFFFFFFFFFFF],
66                          [0x7FFFFFFFFFFFFFFF,   64, 0x7FFFFFFFFFFFFFFF],
67                          [0x7FFFFFFFFFFFFFFF,  -64, 0x7FFFFFFFFFFFFFFF],
68                          [0x7FFFFFFFFFFFFFFF,    1, 0x3FFFFFFFFFFFFFFF],
69                          [0x7FFFFFFFFFFFFFFF,   65, 0x3FFFFFFFFFFFFFFF],
70                          [0x7FFFFFFFFFFFFFFF,   62, 1],
71                          [0x7FFFFFFFFFFFFFFF,  126, 1],
72                          [0x7FFFFFFFFFFFFFFF,   63, 0],
73                          [0x7FFFFFFFFFFFFFFF,  127, 0],
74                          [0x7FFFFFFFFFFFFFFF,   -1, 0],
75                          [-1,  0, -1],
76                          [-1,  1, -1],
77                          [-1, 63, -1],
78                          [-4,  0, -4],
79                          [-4,  1, -2],
80                          [-4, 63, -1],
81                         ];
82
83    // runtime tests
84    for (let i: int = 0; i<tests.length; i++)
85    {
86        assert (tests[i][0] >> tests[i][1] == tests[i][2])
87    }
88
89    // compile time tests
90    assert(0x7FFFFFFFFFFFFFFF >>    0 == 0x7FFFFFFFFFFFFFFF);
91    assert(0x7FFFFFFFFFFFFFFF >>   64 == 0x7FFFFFFFFFFFFFFF);
92    assert(0x7FFFFFFFFFFFFFFF >>  -64 == 0x7FFFFFFFFFFFFFFF);
93    assert(0x7FFFFFFFFFFFFFFF >>    1 == 0x3FFFFFFFFFFFFFFF);
94    assert(0x7FFFFFFFFFFFFFFF >>   65 == 0x3FFFFFFFFFFFFFFF);
95    assert(0x7FFFFFFFFFFFFFFF >>   62 == 1);
96    assert(0x7FFFFFFFFFFFFFFF >>  126 == 1);
97    assert(0x7FFFFFFFFFFFFFFF >>   63 == 0);
98    assert(0x7FFFFFFFFFFFFFFF >>  127 == 0);
99    assert(0x7FFFFFFFFFFFFFFF >>   -1 == 0);
100    assert(-1 >>  0 == -1);
101    assert(-1 >>  1 == -1);
102    assert(-1 >> 63 == -1);
103    assert(-4 >>  0 == -4);
104    assert(-4 >>  1 == -2);
105    assert(-4 >> 63 == -1);
106}
107
108
109function main(): void
110{
111    test_signed_right_shift_int();
112    test_signed_right_shift_long();
113}
114