Skip to content

Commit af4522a

Browse files
committed
Add isInt() method to Value
1 parent d3add54 commit af4522a

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

include/scratchcpp/value.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,29 @@ class LIBSCRATCHCPP_EXPORT Value
236236
}
237237
}
238238

239+
/*! Returns true if this value represents a round integer. */
240+
bool isInt() const
241+
{
242+
// https://github.com/scratchfoundation/scratch-vm/blob/112989da0e7306eeb405a5c52616e41c2164af24/src/util/cast.js#L157-L181
243+
switch (m_type) {
244+
case Type::Integer:
245+
case Type::Bool:
246+
case Type::Infinity:
247+
case Type::NegativeInfinity:
248+
case Type::NaN:
249+
return true;
250+
case Type::Double: {
251+
double intpart;
252+
std::modf(m_doubleValue, &intpart);
253+
return m_doubleValue == intpart;
254+
}
255+
case Type::String:
256+
return m_stringValue.find('.') == std::string::npos;
257+
}
258+
259+
return false;
260+
}
261+
239262
/*! Returns true if the value is a boolean. */
240263
bool isBool() const { return m_type == Type::Bool; }
241264

test/scratch_classes/value_test.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ TEST(ValueTest, DefaultConstructor)
1414
ASSERT_FALSE(v.isNaN());
1515
ASSERT_TRUE(v.isNumber());
1616
ASSERT_TRUE(v.isValidNumber());
17+
ASSERT_TRUE(v.isInt());
1718
ASSERT_FALSE(v.isBool());
1819
ASSERT_FALSE(v.isString());
1920
}
@@ -29,6 +30,7 @@ TEST(ValueTest, FloatConstructor)
2930
ASSERT_FALSE(v.isNaN());
3031
ASSERT_TRUE(v.isNumber());
3132
ASSERT_TRUE(v.isValidNumber());
33+
ASSERT_FALSE(v.isInt());
3234
ASSERT_FALSE(v.isBool());
3335
ASSERT_FALSE(v.isString());
3436
}
@@ -81,6 +83,21 @@ TEST(ValueTest, DoubleConstructor)
8183
ASSERT_FALSE(v.isNaN());
8284
ASSERT_TRUE(v.isNumber());
8385
ASSERT_TRUE(v.isValidNumber());
86+
ASSERT_FALSE(v.isInt());
87+
ASSERT_FALSE(v.isBool());
88+
ASSERT_FALSE(v.isString());
89+
}
90+
91+
{
92+
Value v(static_cast<double>(-5.0));
93+
ASSERT_EQ(v.toDouble(), -5.0);
94+
ASSERT_EQ(v.type(), Value::Type::Double);
95+
ASSERT_FALSE(v.isInfinity());
96+
ASSERT_FALSE(v.isNegativeInfinity());
97+
ASSERT_FALSE(v.isNaN());
98+
ASSERT_TRUE(v.isNumber());
99+
ASSERT_TRUE(v.isValidNumber());
100+
ASSERT_TRUE(v.isInt());
84101
ASSERT_FALSE(v.isBool());
85102
ASSERT_FALSE(v.isString());
86103
}
@@ -132,6 +149,7 @@ TEST(ValueTest, IntConstructor)
132149
ASSERT_FALSE(v.isNaN());
133150
ASSERT_TRUE(v.isNumber());
134151
ASSERT_TRUE(v.isValidNumber());
152+
ASSERT_TRUE(v.isInt());
135153
ASSERT_FALSE(v.isBool());
136154
ASSERT_FALSE(v.isString());
137155
}
@@ -146,6 +164,7 @@ TEST(ValueTest, SizeTConstructor)
146164
ASSERT_FALSE(v.isNaN());
147165
ASSERT_TRUE(v.isNumber());
148166
ASSERT_TRUE(v.isValidNumber());
167+
ASSERT_TRUE(v.isInt());
149168
ASSERT_FALSE(v.isBool());
150169
ASSERT_FALSE(v.isString());
151170
}
@@ -160,6 +179,7 @@ TEST(ValueTest, LongConstructor)
160179
ASSERT_FALSE(v.isNaN());
161180
ASSERT_TRUE(v.isNumber());
162181
ASSERT_TRUE(v.isValidNumber());
182+
ASSERT_TRUE(v.isInt());
163183
ASSERT_FALSE(v.isBool());
164184
ASSERT_FALSE(v.isString());
165185
}
@@ -175,6 +195,7 @@ TEST(ValueTest, BoolConstructor)
175195
ASSERT_FALSE(v.isNaN());
176196
ASSERT_FALSE(v.isNumber());
177197
ASSERT_TRUE(v.isValidNumber());
198+
ASSERT_TRUE(v.isInt());
178199
ASSERT_TRUE(v.isBool());
179200
ASSERT_FALSE(v.isString());
180201
}
@@ -188,6 +209,7 @@ TEST(ValueTest, BoolConstructor)
188209
ASSERT_FALSE(v.isNaN());
189210
ASSERT_FALSE(v.isNumber());
190211
ASSERT_TRUE(v.isValidNumber());
212+
ASSERT_TRUE(v.isInt());
191213
ASSERT_TRUE(v.isBool());
192214
ASSERT_FALSE(v.isString());
193215
}
@@ -204,6 +226,7 @@ TEST(ValueTest, StdStringConstructor)
204226
ASSERT_FALSE(v.isNaN());
205227
ASSERT_FALSE(v.isNumber());
206228
ASSERT_FALSE(v.isValidNumber());
229+
ASSERT_TRUE(v.isInt());
207230
ASSERT_FALSE(v.isBool());
208231
ASSERT_TRUE(v.isString());
209232
}
@@ -217,6 +240,7 @@ TEST(ValueTest, StdStringConstructor)
217240
ASSERT_FALSE(v.isNaN());
218241
ASSERT_FALSE(v.isNumber());
219242
ASSERT_TRUE(v.isValidNumber());
243+
ASSERT_TRUE(v.isInt());
220244
ASSERT_FALSE(v.isBool());
221245
ASSERT_TRUE(v.isString());
222246
}
@@ -231,6 +255,7 @@ TEST(ValueTest, StdStringConstructor)
231255
ASSERT_FALSE(v.isNaN());
232256
ASSERT_FALSE(v.isNumber());
233257
ASSERT_TRUE(v.isValidNumber());
258+
ASSERT_FALSE(v.isInt());
234259
ASSERT_FALSE(v.isBool());
235260
ASSERT_TRUE(v.isString());
236261
}
@@ -244,6 +269,7 @@ TEST(ValueTest, StdStringConstructor)
244269
ASSERT_FALSE(v.isNaN());
245270
ASSERT_FALSE(v.isNumber());
246271
ASSERT_FALSE(v.isValidNumber());
272+
ASSERT_TRUE(v.isInt());
247273
ASSERT_FALSE(v.isBool());
248274
ASSERT_TRUE(v.isString());
249275
}
@@ -258,6 +284,7 @@ TEST(ValueTest, StdStringConstructor)
258284
ASSERT_FALSE(v.isNaN());
259285
ASSERT_FALSE(v.isNumber());
260286
ASSERT_TRUE(v.isValidNumber());
287+
ASSERT_TRUE(v.isInt());
261288
ASSERT_FALSE(v.isBool());
262289
ASSERT_TRUE(v.isString());
263290
}
@@ -272,6 +299,7 @@ TEST(ValueTest, StdStringConstructor)
272299
ASSERT_FALSE(v.isNaN());
273300
ASSERT_FALSE(v.isNumber());
274301
ASSERT_FALSE(v.isValidNumber());
302+
ASSERT_TRUE(v.isInt());
275303
ASSERT_FALSE(v.isBool());
276304
ASSERT_TRUE(v.isString());
277305
}
@@ -324,6 +352,7 @@ TEST(ValueTest, CStringConstructor)
324352
ASSERT_FALSE(v.isNaN());
325353
ASSERT_FALSE(v.isNumber());
326354
ASSERT_FALSE(v.isValidNumber());
355+
ASSERT_TRUE(v.isInt());
327356
ASSERT_FALSE(v.isBool());
328357
ASSERT_TRUE(v.isString());
329358
}
@@ -374,6 +403,7 @@ TEST(ValueTest, InfinityConstructor)
374403
ASSERT_FALSE(v.isNaN());
375404
ASSERT_FALSE(v.isNumber());
376405
ASSERT_TRUE(v.isValidNumber());
406+
ASSERT_TRUE(v.isInt());
377407
ASSERT_FALSE(v.isBool());
378408
ASSERT_FALSE(v.isString());
379409
}
@@ -387,6 +417,7 @@ TEST(ValueTest, NegativeInfinityConstructor)
387417
ASSERT_FALSE(v.isNaN());
388418
ASSERT_FALSE(v.isNumber());
389419
ASSERT_TRUE(v.isValidNumber());
420+
ASSERT_TRUE(v.isInt());
390421
ASSERT_FALSE(v.isBool());
391422
ASSERT_FALSE(v.isString());
392423
}
@@ -400,6 +431,7 @@ TEST(ValueTest, NaNConstructor)
400431
ASSERT_TRUE(v.isNaN());
401432
ASSERT_FALSE(v.isNumber());
402433
ASSERT_FALSE(v.isValidNumber());
434+
ASSERT_TRUE(v.isInt());
403435
ASSERT_FALSE(v.isBool());
404436
ASSERT_FALSE(v.isString());
405437
}

0 commit comments

Comments
 (0)