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
16class A {
17    _field: int = 30;
18
19    get field(): int {
20        return this._field;
21    }
22
23    set field(field: int): void {
24        this._field = field;
25    }
26}
27
28function main(): void {
29    let objectos = new A;
30
31    // left side
32    objectos.field += 10;
33    assert objectos.field == 40;
34
35    objectos.field -= 200;
36    assert objectos.field == -160;
37
38    objectos.field += 260;
39    objectos.field *= 10;
40    assert objectos.field == 1000;
41
42    objectos.field /= 100;
43    assert objectos.field == 10;
44
45    objectos.field = 16;
46    objectos.field >>= 2
47    assert objectos.field == 4;
48
49    objectos.field = 16;
50    objectos.field >>>= 1
51    assert objectos.field == 8;
52
53    objectos.field = 8;
54    objectos.field <<= 1
55    assert objectos.field == 16;
56
57    objectos.field = 5;
58    objectos.field %= 2
59    assert objectos.field == 1;
60
61    objectos.field = 15;
62    objectos.field &= 7
63    assert objectos.field == 7;
64
65    objectos.field = 15;
66    objectos.field |= 7
67    assert objectos.field == 15;
68
69    objectos.field = 15;
70    objectos.field ^= 7
71    assert objectos.field == 8;
72
73    // left and right side
74
75    objectos.field = 100;
76    objectos.field += objectos.field;
77    assert objectos.field == 200;
78
79    objectos.field -= objectos.field;
80    assert objectos.field == 0;
81
82    objectos.field += 100;
83    objectos.field *= objectos.field;
84    assert objectos.field == 10000;
85
86    objectos.field /= objectos.field;
87    assert objectos.field == 1;
88
89    objectos.field |= objectos.field
90    assert objectos.field == 1;
91
92    // right side
93
94    let value = 100;
95    objectos.field = 2;
96
97    value += objectos.field;
98    assert value == 102;
99
100    value -= objectos.field;
101    assert value == 100;
102
103    value *= objectos.field;
104    assert value == 200;
105
106    value /= objectos.field;
107    assert value == 100;
108
109    value = 16;
110    value >>= objectos.field
111    assert value == 4;
112
113    value = 16;
114    value >>>= objectos.field
115    assert value == 4;
116
117    value = 8;
118    value <<= objectos.field
119    assert value == 32;
120
121    value = 5;
122    value %= objectos.field
123    assert value == 1;
124
125    value = 15;
126    value &= objectos.field
127    assert value == 2;
128
129    value = 15;
130    value |= objectos.field
131    assert value == 15;
132
133    value = 15;
134    value ^= objectos.field
135    assert value == 13;
136}
137