forked from facebook/hermes
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCastingTest.cpp
More file actions
91 lines (72 loc) · 3.67 KB
/
CastingTest.cpp
File metadata and controls
91 lines (72 loc) · 3.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#include "hermes/VM/Casting.h"
#include "TestHelpers.h"
#include "hermes/VM/Runtime.h"
#include "gtest/gtest.h"
using namespace hermes::vm;
namespace {
TEST(CastingTest, SmokeTest) {
auto rt = DummyRuntime::create(kTestGCConfigSmall);
DummyRuntime &runtime = *rt;
GCScope gcScope(&runtime);
const int TAG1 = 1234;
const SymbolID TAG2 = SymbolID::unsafeCreate(4567);
const auto HVTAG1 = HermesValue::encodeNumberValue(1234);
// Using a Symbol here gives us a completely different internal representation
// than the HV (even when HV32 is disabled), and works around the fact that
// SmallHermesValue does not support DummyRuntime.
const auto SHVTAG2 = SmallHermesValue::encodeSymbolValue(TAG2);
auto h1 =
runtime.makeHandle(ArrayStorage::createForTest(&runtime.getHeap(), 1));
h1->set(0, HVTAG1, &runtime.getHeap());
auto h2 = runtime.makeHandle(
ArrayStorageSmall::createForTest(&runtime.getHeap(), 1));
h2->set(0, SHVTAG2, &runtime.getHeap());
GCCell *p1 = h1.get();
GCCell *p2 = h2.get();
auto v1 = HermesValue::encodeObjectValue(p1);
auto v2 = HermesValue::encodeObjectValue(p2);
auto nullv = HermesValue::encodeObjectValue(nullptr);
EXPECT_EQ(TAG1, vmcast<ArrayStorage>(p1)->at(0).getNumber());
EXPECT_EQ(TAG2, vmcast<ArrayStorageSmall>(p2)->at(0).getSymbol());
EXPECT_EQ(TAG1, vmcast<ArrayStorage>(v1)->at(0).getNumber());
EXPECT_EQ(TAG2, vmcast<ArrayStorageSmall>(v2)->at(0).getSymbol());
EXPECT_EQ(TAG1, vmcast_or_null<ArrayStorage>(p1)->at(0).getNumber());
EXPECT_EQ(TAG2, vmcast_or_null<ArrayStorageSmall>(p2)->at(0).getSymbol());
EXPECT_EQ(TAG1, vmcast_or_null<ArrayStorage>(v1)->at(0).getNumber());
EXPECT_EQ(TAG2, vmcast_or_null<ArrayStorageSmall>(v2)->at(0).getSymbol());
EXPECT_EQ(nullptr, vmcast_or_null<ArrayStorage>(nullptr));
EXPECT_EQ(nullptr, vmcast_or_null<ArrayStorage>(nullv));
EXPECT_NE(nullptr, dyn_vmcast<ArrayStorage>(p1));
EXPECT_NE(nullptr, dyn_vmcast<ArrayStorageSmall>(p2));
EXPECT_NE(nullptr, dyn_vmcast<ArrayStorage>(v1));
EXPECT_NE(nullptr, dyn_vmcast<ArrayStorageSmall>(v2));
EXPECT_EQ(nullptr, dyn_vmcast<ArrayStorage>(p2));
EXPECT_EQ(nullptr, dyn_vmcast<ArrayStorageSmall>(p1));
EXPECT_EQ(nullptr, dyn_vmcast<ArrayStorage>(v2));
EXPECT_EQ(nullptr, dyn_vmcast<ArrayStorageSmall>(v1));
EXPECT_EQ(TAG1, dyn_vmcast<ArrayStorage>(p1)->at(0).getNumber());
EXPECT_EQ(TAG2, dyn_vmcast<ArrayStorageSmall>(p2)->at(0).getSymbol());
EXPECT_EQ(TAG1, dyn_vmcast<ArrayStorage>(v1)->at(0).getNumber());
EXPECT_EQ(TAG2, dyn_vmcast<ArrayStorageSmall>(v2)->at(0).getSymbol());
EXPECT_NE(nullptr, dyn_vmcast_or_null<ArrayStorage>(p1));
EXPECT_NE(nullptr, dyn_vmcast_or_null<ArrayStorageSmall>(p2));
EXPECT_NE(nullptr, dyn_vmcast_or_null<ArrayStorage>(v1));
EXPECT_NE(nullptr, dyn_vmcast_or_null<ArrayStorageSmall>(v2));
EXPECT_EQ(nullptr, dyn_vmcast_or_null<ArrayStorage>(p2));
EXPECT_EQ(nullptr, dyn_vmcast_or_null<ArrayStorageSmall>(p1));
EXPECT_EQ(nullptr, dyn_vmcast_or_null<ArrayStorage>(v2));
EXPECT_EQ(nullptr, dyn_vmcast_or_null<ArrayStorageSmall>(v1));
EXPECT_EQ(nullptr, dyn_vmcast_or_null<ArrayStorage>(nullptr));
EXPECT_EQ(nullptr, dyn_vmcast_or_null<ArrayStorage>(nullv));
EXPECT_EQ(TAG1, dyn_vmcast_or_null<ArrayStorage>(p1)->at(0).getNumber());
EXPECT_EQ(TAG2, dyn_vmcast_or_null<ArrayStorageSmall>(p2)->at(0).getSymbol());
EXPECT_EQ(TAG1, dyn_vmcast_or_null<ArrayStorage>(v1)->at(0).getNumber());
EXPECT_EQ(TAG2, dyn_vmcast_or_null<ArrayStorageSmall>(v2)->at(0).getSymbol());
}
} // namespace