1617a3babSopenharmony_ci// Copyright (c) 2021 Google LLC
2617a3babSopenharmony_ci//
3617a3babSopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
4617a3babSopenharmony_ci// you may not use this file except in compliance with the License.
5617a3babSopenharmony_ci// You may obtain a copy of the License at
6617a3babSopenharmony_ci//
7617a3babSopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
8617a3babSopenharmony_ci//
9617a3babSopenharmony_ci// Unless required by applicable law or agreed to in writing, software
10617a3babSopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
11617a3babSopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12617a3babSopenharmony_ci// See the License for the specific language governing permissions and
13617a3babSopenharmony_ci// limitations under the License.
14617a3babSopenharmony_ci
15617a3babSopenharmony_ci#include <cstdint>
16617a3babSopenharmony_ci
17617a3babSopenharmony_ci#include <gmock/gmock.h>
18617a3babSopenharmony_ci#include "glslang/Include/Common.h"
19617a3babSopenharmony_ci
20617a3babSopenharmony_cinamespace {
21617a3babSopenharmony_ci
22617a3babSopenharmony_ciTEST(IsPow2, Int_Negative) {
23617a3babSopenharmony_ci  EXPECT_EQ(false, glslang::IsPow2(-5));
24617a3babSopenharmony_ci  EXPECT_EQ(false, glslang::IsPow2(-1));
25617a3babSopenharmony_ci  EXPECT_EQ(false, glslang::IsPow2(INT_MIN));
26617a3babSopenharmony_ci  EXPECT_EQ(false, glslang::IsPow2(int64_t(-10)));
27617a3babSopenharmony_ci}
28617a3babSopenharmony_ci
29617a3babSopenharmony_ciTEST(IsPow2, Zero) {
30617a3babSopenharmony_ci  EXPECT_EQ(false, glslang::IsPow2(0));
31617a3babSopenharmony_ci  EXPECT_EQ(false, glslang::IsPow2(0u));
32617a3babSopenharmony_ci  EXPECT_EQ(false, glslang::IsPow2(0));
33617a3babSopenharmony_ci  EXPECT_EQ(false, glslang::IsPow2(uint64_t(0)));
34617a3babSopenharmony_ci  EXPECT_EQ(false, glslang::IsPow2(int64_t(0)));
35617a3babSopenharmony_ci}
36617a3babSopenharmony_ci
37617a3babSopenharmony_ciTEST(IsPow2, Int_Positive_PowersOf2) {
38617a3babSopenharmony_ci  EXPECT_EQ(true, glslang::IsPow2(1));
39617a3babSopenharmony_ci  EXPECT_EQ(true, glslang::IsPow2(2));
40617a3babSopenharmony_ci  EXPECT_EQ(true, glslang::IsPow2(4));
41617a3babSopenharmony_ci  EXPECT_EQ(true, glslang::IsPow2(8));
42617a3babSopenharmony_ci  EXPECT_EQ(true, glslang::IsPow2(16));
43617a3babSopenharmony_ci  EXPECT_EQ(true, glslang::IsPow2(32768));
44617a3babSopenharmony_ci  EXPECT_EQ(true, glslang::IsPow2(65536));
45617a3babSopenharmony_ci  EXPECT_EQ(true, glslang::IsPow2(2147483648));
46617a3babSopenharmony_ci}
47617a3babSopenharmony_ci
48617a3babSopenharmony_ciTEST(IsPow2, Int_Positive_NonPowersOf2) {
49617a3babSopenharmony_ci  EXPECT_EQ(false, glslang::IsPow2(3));
50617a3babSopenharmony_ci  EXPECT_EQ(false, glslang::IsPow2(5));
51617a3babSopenharmony_ci  EXPECT_EQ(false, glslang::IsPow2(2147483647));
52617a3babSopenharmony_ci}
53617a3babSopenharmony_ci
54617a3babSopenharmony_ciTEST(IsPow2, Uint_Positive_PowersOf2) {
55617a3babSopenharmony_ci  EXPECT_EQ(true, glslang::IsPow2(1u));
56617a3babSopenharmony_ci  EXPECT_EQ(true, glslang::IsPow2(2u));
57617a3babSopenharmony_ci  EXPECT_EQ(true, glslang::IsPow2(4u));
58617a3babSopenharmony_ci  EXPECT_EQ(true, glslang::IsPow2(8u));
59617a3babSopenharmony_ci  EXPECT_EQ(true, glslang::IsPow2(16u));
60617a3babSopenharmony_ci  EXPECT_EQ(true, glslang::IsPow2(32768u));
61617a3babSopenharmony_ci  EXPECT_EQ(true, glslang::IsPow2(65536u));
62617a3babSopenharmony_ci  EXPECT_EQ(true, glslang::IsPow2(2147483648u));
63617a3babSopenharmony_ci}
64617a3babSopenharmony_ci
65617a3babSopenharmony_ciTEST(IsPow2, Uint_Positive_NonPowersOf2) {
66617a3babSopenharmony_ci  EXPECT_EQ(false, glslang::IsPow2(3u));
67617a3babSopenharmony_ci  EXPECT_EQ(false, glslang::IsPow2(5u));
68617a3babSopenharmony_ci  EXPECT_EQ(false, glslang::IsPow2(2147483647u));
69617a3babSopenharmony_ci}
70617a3babSopenharmony_ci
71617a3babSopenharmony_ciTEST(IntLog2, Int) {
72617a3babSopenharmony_ci  EXPECT_EQ(0, glslang::IntLog2(1));
73617a3babSopenharmony_ci  EXPECT_EQ(1, glslang::IntLog2(2));
74617a3babSopenharmony_ci  EXPECT_EQ(2, glslang::IntLog2(4));
75617a3babSopenharmony_ci  EXPECT_EQ(3, glslang::IntLog2(8));
76617a3babSopenharmony_ci  EXPECT_EQ(4, glslang::IntLog2(16));
77617a3babSopenharmony_ci  EXPECT_EQ(5, glslang::IntLog2(32));
78617a3babSopenharmony_ci  EXPECT_EQ(6, glslang::IntLog2(64));
79617a3babSopenharmony_ci  EXPECT_EQ(7, glslang::IntLog2(128));
80617a3babSopenharmony_ci  EXPECT_EQ(8, glslang::IntLog2(256));
81617a3babSopenharmony_ci  EXPECT_EQ(9, glslang::IntLog2(512));
82617a3babSopenharmony_ci  EXPECT_EQ(10, glslang::IntLog2(1024));
83617a3babSopenharmony_ci  EXPECT_EQ(11, glslang::IntLog2(2048));
84617a3babSopenharmony_ci  EXPECT_EQ(12, glslang::IntLog2(0x1000));
85617a3babSopenharmony_ci  EXPECT_EQ(13, glslang::IntLog2(0x2000));
86617a3babSopenharmony_ci  EXPECT_EQ(14, glslang::IntLog2(0x4000));
87617a3babSopenharmony_ci  EXPECT_EQ(15, glslang::IntLog2(0x8000));
88617a3babSopenharmony_ci  EXPECT_EQ(16, glslang::IntLog2(0x10000));
89617a3babSopenharmony_ci  EXPECT_EQ(17, glslang::IntLog2(0x20000));
90617a3babSopenharmony_ci  EXPECT_EQ(18, glslang::IntLog2(0x40000));
91617a3babSopenharmony_ci  EXPECT_EQ(19, glslang::IntLog2(0x80000));
92617a3babSopenharmony_ci  EXPECT_EQ(20, glslang::IntLog2(0x100000));
93617a3babSopenharmony_ci  EXPECT_EQ(21, glslang::IntLog2(0x200000));
94617a3babSopenharmony_ci  EXPECT_EQ(22, glslang::IntLog2(0x400000));
95617a3babSopenharmony_ci  EXPECT_EQ(23, glslang::IntLog2(0x800000));
96617a3babSopenharmony_ci  EXPECT_EQ(24, glslang::IntLog2(0x1000000));
97617a3babSopenharmony_ci  EXPECT_EQ(25, glslang::IntLog2(0x2000000));
98617a3babSopenharmony_ci  EXPECT_EQ(26, glslang::IntLog2(0x4000000));
99617a3babSopenharmony_ci  EXPECT_EQ(27, glslang::IntLog2(0x8000000));
100617a3babSopenharmony_ci  EXPECT_EQ(28, glslang::IntLog2(0x10000000));
101617a3babSopenharmony_ci  EXPECT_EQ(29, glslang::IntLog2(0x20000000));
102617a3babSopenharmony_ci  EXPECT_EQ(30, glslang::IntLog2(0x40000000));
103617a3babSopenharmony_ci}
104617a3babSopenharmony_ci
105617a3babSopenharmony_ciTEST(IntLog2, Uint) {
106617a3babSopenharmony_ci  EXPECT_EQ(0, glslang::IntLog2(1u));
107617a3babSopenharmony_ci  EXPECT_EQ(1, glslang::IntLog2(2u));
108617a3babSopenharmony_ci  EXPECT_EQ(2, glslang::IntLog2(4u));
109617a3babSopenharmony_ci  EXPECT_EQ(3, glslang::IntLog2(8u));
110617a3babSopenharmony_ci  EXPECT_EQ(4, glslang::IntLog2(16u));
111617a3babSopenharmony_ci  EXPECT_EQ(5, glslang::IntLog2(32u));
112617a3babSopenharmony_ci  EXPECT_EQ(6, glslang::IntLog2(64u));
113617a3babSopenharmony_ci  EXPECT_EQ(7, glslang::IntLog2(128u));
114617a3babSopenharmony_ci  EXPECT_EQ(8, glslang::IntLog2(256u));
115617a3babSopenharmony_ci  EXPECT_EQ(9, glslang::IntLog2(512u));
116617a3babSopenharmony_ci  EXPECT_EQ(10, glslang::IntLog2(1024u));
117617a3babSopenharmony_ci  EXPECT_EQ(11, glslang::IntLog2(2048u));
118617a3babSopenharmony_ci  EXPECT_EQ(12, glslang::IntLog2(0x1000u));
119617a3babSopenharmony_ci  EXPECT_EQ(13, glslang::IntLog2(0x2000u));
120617a3babSopenharmony_ci  EXPECT_EQ(14, glslang::IntLog2(0x4000u));
121617a3babSopenharmony_ci  EXPECT_EQ(15, glslang::IntLog2(0x8000u));
122617a3babSopenharmony_ci  EXPECT_EQ(16, glslang::IntLog2(0x10000u));
123617a3babSopenharmony_ci  EXPECT_EQ(17, glslang::IntLog2(0x20000u));
124617a3babSopenharmony_ci  EXPECT_EQ(18, glslang::IntLog2(0x40000u));
125617a3babSopenharmony_ci  EXPECT_EQ(19, glslang::IntLog2(0x80000u));
126617a3babSopenharmony_ci  EXPECT_EQ(20, glslang::IntLog2(0x100000u));
127617a3babSopenharmony_ci  EXPECT_EQ(21, glslang::IntLog2(0x200000u));
128617a3babSopenharmony_ci  EXPECT_EQ(22, glslang::IntLog2(0x400000u));
129617a3babSopenharmony_ci  EXPECT_EQ(23, glslang::IntLog2(0x800000u));
130617a3babSopenharmony_ci  EXPECT_EQ(24, glslang::IntLog2(0x1000000u));
131617a3babSopenharmony_ci  EXPECT_EQ(25, glslang::IntLog2(0x2000000u));
132617a3babSopenharmony_ci  EXPECT_EQ(26, glslang::IntLog2(0x4000000u));
133617a3babSopenharmony_ci  EXPECT_EQ(27, glslang::IntLog2(0x8000000u));
134617a3babSopenharmony_ci  EXPECT_EQ(28, glslang::IntLog2(0x10000000u));
135617a3babSopenharmony_ci  EXPECT_EQ(29, glslang::IntLog2(0x20000000u));
136617a3babSopenharmony_ci  EXPECT_EQ(30, glslang::IntLog2(0x40000000u));
137617a3babSopenharmony_ci  EXPECT_EQ(31, glslang::IntLog2(0x80000000u));
138617a3babSopenharmony_ci}
139617a3babSopenharmony_ci
140617a3babSopenharmony_ciTEST(IntLog2, Int64) {
141617a3babSopenharmony_ci  EXPECT_EQ(0, glslang::IntLog2(int64_t(1)));
142617a3babSopenharmony_ci  EXPECT_EQ(1, glslang::IntLog2(int64_t(2)));
143617a3babSopenharmony_ci  EXPECT_EQ(2, glslang::IntLog2(int64_t(4)));
144617a3babSopenharmony_ci  EXPECT_EQ(3, glslang::IntLog2(int64_t(8)));
145617a3babSopenharmony_ci  EXPECT_EQ(30, glslang::IntLog2(int64_t(0x40000000u)));
146617a3babSopenharmony_ci  EXPECT_EQ(31, glslang::IntLog2(int64_t(0x80000000u)));
147617a3babSopenharmony_ci  EXPECT_EQ(32, glslang::IntLog2(int64_t(0x10000) * int64_t(0x10000)));
148617a3babSopenharmony_ci  EXPECT_EQ(48, glslang::IntLog2(int64_t(0x10000) * int64_t(0x10000) * int64_t(0x10000)));
149617a3babSopenharmony_ci  EXPECT_EQ(62, glslang::IntLog2(int64_t(0x10000) * int64_t(0x10000) * int64_t(0x10000) * int64_t(0x4000)));
150617a3babSopenharmony_ci}
151617a3babSopenharmony_ci
152617a3babSopenharmony_ciTEST(IntLog2, Uint64) {
153617a3babSopenharmony_ci  EXPECT_EQ(0, glslang::IntLog2(uint64_t(1)));
154617a3babSopenharmony_ci  EXPECT_EQ(1, glslang::IntLog2(uint64_t(2)));
155617a3babSopenharmony_ci  EXPECT_EQ(2, glslang::IntLog2(uint64_t(4)));
156617a3babSopenharmony_ci  EXPECT_EQ(3, glslang::IntLog2(uint64_t(8)));
157617a3babSopenharmony_ci  EXPECT_EQ(30, glslang::IntLog2(uint64_t(0x40000000u)));
158617a3babSopenharmony_ci  EXPECT_EQ(31, glslang::IntLog2(uint64_t(0x80000000u)));
159617a3babSopenharmony_ci  EXPECT_EQ(32, glslang::IntLog2(uint64_t(0x10000) * uint64_t(0x10000)));
160617a3babSopenharmony_ci  EXPECT_EQ(48, glslang::IntLog2(uint64_t(0x10000) * uint64_t(0x10000) * uint64_t(0x10000)));
161617a3babSopenharmony_ci  EXPECT_EQ(62, glslang::IntLog2(uint64_t(0x10000) * uint64_t(0x10000) * uint64_t(0x10000) * uint64_t(0x4000)));
162617a3babSopenharmony_ci  EXPECT_EQ(63, glslang::IntLog2(uint64_t(0x10000) * uint64_t(0x10000) * uint64_t(0x10000) * uint64_t(0x8000)));
163617a3babSopenharmony_ci}
164617a3babSopenharmony_ci
165617a3babSopenharmony_ci}  // anonymous namespace
166