blob: 47fa0215eada30177d74fb4ec1f48bbcf3194075 [file] [log] [blame]
Pavel Labathb625a0e2016-02-09 17:28:01 +00001//===-- ScalarTest.cpp ------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Pavel Labathb625a0e2016-02-09 17:28:01 +000010#include "gtest/gtest.h"
11
12#include "lldb/Core/Scalar.h"
Zachary Turner666cc0b2017-03-04 01:30:05 +000013#include "lldb/Utility/DataExtractor.h"
Zachary Turner01c32432017-02-14 19:06:07 +000014#include "lldb/Utility/Endian.h"
Zachary Turner97206d52017-05-12 04:51:55 +000015#include "lldb/Utility/Status.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000016#include "lldb/Utility/StreamString.h"
Pavel Labathb625a0e2016-02-09 17:28:01 +000017
18using namespace lldb_private;
19
Kate Stoneb9c1b512016-09-06 20:57:50 +000020TEST(ScalarTest, RightShiftOperator) {
21 int a = 0x00001000;
22 int b = 0xFFFFFFFF;
23 int c = 4;
24 Scalar a_scalar(a);
25 Scalar b_scalar(b);
26 Scalar c_scalar(c);
27 ASSERT_EQ(a >> c, a_scalar >> c_scalar);
28 ASSERT_EQ(b >> c, b_scalar >> c_scalar);
Pavel Labathb625a0e2016-02-09 17:28:01 +000029}
Ulrich Weigand9521ad22016-04-15 09:55:52 +000030
Kate Stoneb9c1b512016-09-06 20:57:50 +000031TEST(ScalarTest, GetBytes) {
32 int a = 0x01020304;
33 long long b = 0x0102030405060708LL;
Raphael Isemann0b16ef72018-01-22 08:11:29 +000034 float c = 1234567.89e32;
Kate Stoneb9c1b512016-09-06 20:57:50 +000035 double d = 1234567.89e42;
36 char e[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
37 char f[32] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
38 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32};
39 Scalar a_scalar(a);
40 Scalar b_scalar(b);
41 Scalar c_scalar(c);
42 Scalar d_scalar(d);
43 Scalar e_scalar;
44 Scalar f_scalar;
45 DataExtractor e_data(e, sizeof(e), endian::InlHostByteOrder(),
46 sizeof(void *));
Zachary Turner97206d52017-05-12 04:51:55 +000047 Status e_error =
Kate Stoneb9c1b512016-09-06 20:57:50 +000048 e_scalar.SetValueFromData(e_data, lldb::eEncodingUint, sizeof(e));
49 DataExtractor f_data(f, sizeof(f), endian::InlHostByteOrder(),
50 sizeof(void *));
Zachary Turner97206d52017-05-12 04:51:55 +000051 Status f_error =
Kate Stoneb9c1b512016-09-06 20:57:50 +000052 f_scalar.SetValueFromData(f_data, lldb::eEncodingUint, sizeof(f));
53 ASSERT_EQ(0, memcmp(&a, a_scalar.GetBytes(), sizeof(a)));
54 ASSERT_EQ(0, memcmp(&b, b_scalar.GetBytes(), sizeof(b)));
55 ASSERT_EQ(0, memcmp(&c, c_scalar.GetBytes(), sizeof(c)));
56 ASSERT_EQ(0, memcmp(&d, d_scalar.GetBytes(), sizeof(d)));
57 ASSERT_EQ(0, e_error.Fail());
58 ASSERT_EQ(0, memcmp(e, e_scalar.GetBytes(), sizeof(e)));
59 ASSERT_EQ(0, f_error.Fail());
60 ASSERT_EQ(0, memcmp(f, f_scalar.GetBytes(), sizeof(f)));
Ulrich Weigand9521ad22016-04-15 09:55:52 +000061}
62
Kate Stoneb9c1b512016-09-06 20:57:50 +000063TEST(ScalarTest, CastOperations) {
64 long long a = 0xf1f2f3f4f5f6f7f8LL;
65 Scalar a_scalar(a);
66 ASSERT_EQ((signed char)a, a_scalar.SChar());
67 ASSERT_EQ((unsigned char)a, a_scalar.UChar());
68 ASSERT_EQ((signed short)a, a_scalar.SShort());
69 ASSERT_EQ((unsigned short)a, a_scalar.UShort());
70 ASSERT_EQ((signed int)a, a_scalar.SInt());
71 ASSERT_EQ((unsigned int)a, a_scalar.UInt());
72 ASSERT_EQ((signed long)a, a_scalar.SLong());
73 ASSERT_EQ((unsigned long)a, a_scalar.ULong());
74 ASSERT_EQ((signed long long)a, a_scalar.SLongLong());
75 ASSERT_EQ((unsigned long long)a, a_scalar.ULongLong());
Ulrich Weigand9521ad22016-04-15 09:55:52 +000076}
77
Kate Stoneb9c1b512016-09-06 20:57:50 +000078TEST(ScalarTest, ExtractBitfield) {
79 uint32_t len = sizeof(long long) * 8;
Bryan Chan01319e92016-05-19 13:51:20 +000080
Kate Stoneb9c1b512016-09-06 20:57:50 +000081 long long a1 = 0xf1f2f3f4f5f6f7f8LL;
82 long long b1 = 0xff1f2f3f4f5f6f7fLL;
83 Scalar s_scalar(a1);
84 ASSERT_TRUE(s_scalar.ExtractBitfield(0, 0));
85 ASSERT_EQ(0, memcmp(&a1, s_scalar.GetBytes(), sizeof(a1)));
86 ASSERT_TRUE(s_scalar.ExtractBitfield(len, 0));
87 ASSERT_EQ(0, memcmp(&a1, s_scalar.GetBytes(), sizeof(a1)));
88 ASSERT_TRUE(s_scalar.ExtractBitfield(len - 4, 4));
89 ASSERT_EQ(0, memcmp(&b1, s_scalar.GetBytes(), sizeof(b1)));
Bryan Chan01319e92016-05-19 13:51:20 +000090
Kate Stoneb9c1b512016-09-06 20:57:50 +000091 unsigned long long a2 = 0xf1f2f3f4f5f6f7f8ULL;
92 unsigned long long b2 = 0x0f1f2f3f4f5f6f7fULL;
93 Scalar u_scalar(a2);
94 ASSERT_TRUE(u_scalar.ExtractBitfield(0, 0));
95 ASSERT_EQ(0, memcmp(&a2, u_scalar.GetBytes(), sizeof(a2)));
96 ASSERT_TRUE(u_scalar.ExtractBitfield(len, 0));
97 ASSERT_EQ(0, memcmp(&a2, u_scalar.GetBytes(), sizeof(a2)));
98 ASSERT_TRUE(u_scalar.ExtractBitfield(len - 4, 4));
99 ASSERT_EQ(0, memcmp(&b2, u_scalar.GetBytes(), sizeof(b2)));
Bryan Chan01319e92016-05-19 13:51:20 +0000100}
Pavel Labathf92756e2016-09-02 10:58:52 +0000101
Kate Stoneb9c1b512016-09-06 20:57:50 +0000102template <typename T> static std::string ScalarGetValue(T value) {
103 StreamString stream;
104 Scalar(value).GetValue(&stream, false);
105 return stream.GetString();
Pavel Labathf92756e2016-09-02 10:58:52 +0000106}
107
Kate Stoneb9c1b512016-09-06 20:57:50 +0000108TEST(ScalarTest, GetValue) {
109 EXPECT_EQ("12345", ScalarGetValue<signed short>(12345));
110 EXPECT_EQ("-12345", ScalarGetValue<signed short>(-12345));
111 EXPECT_EQ("12345", ScalarGetValue<unsigned short>(12345));
112 EXPECT_EQ(std::to_string(std::numeric_limits<unsigned short>::max()),
113 ScalarGetValue(std::numeric_limits<unsigned short>::max()));
Pavel Labathf92756e2016-09-02 10:58:52 +0000114
Kate Stoneb9c1b512016-09-06 20:57:50 +0000115 EXPECT_EQ("12345", ScalarGetValue<signed int>(12345));
116 EXPECT_EQ("-12345", ScalarGetValue<signed int>(-12345));
117 EXPECT_EQ("12345", ScalarGetValue<unsigned int>(12345));
118 EXPECT_EQ(std::to_string(std::numeric_limits<unsigned int>::max()),
119 ScalarGetValue(std::numeric_limits<unsigned int>::max()));
Pavel Labathf92756e2016-09-02 10:58:52 +0000120
Kate Stoneb9c1b512016-09-06 20:57:50 +0000121 EXPECT_EQ("12345678", ScalarGetValue<signed long>(12345678L));
122 EXPECT_EQ("-12345678", ScalarGetValue<signed long>(-12345678L));
123 EXPECT_EQ("12345678", ScalarGetValue<unsigned long>(12345678UL));
124 EXPECT_EQ(std::to_string(std::numeric_limits<unsigned long>::max()),
125 ScalarGetValue(std::numeric_limits<unsigned long>::max()));
Pavel Labathf92756e2016-09-02 10:58:52 +0000126
Kate Stoneb9c1b512016-09-06 20:57:50 +0000127 EXPECT_EQ("1234567890123", ScalarGetValue<signed long long>(1234567890123LL));
128 EXPECT_EQ("-1234567890123",
129 ScalarGetValue<signed long long>(-1234567890123LL));
130 EXPECT_EQ("1234567890123",
131 ScalarGetValue<unsigned long long>(1234567890123ULL));
132 EXPECT_EQ(std::to_string(std::numeric_limits<unsigned long long>::max()),
133 ScalarGetValue(std::numeric_limits<unsigned long long>::max()));
Pavel Labathf92756e2016-09-02 10:58:52 +0000134}
Davide Italiano01c33b82018-03-27 18:37:54 +0000135
136TEST(ScalarTest, Division) {
137 Scalar lhs(5.0);
138 Scalar rhs(2.0);
139 Scalar r = lhs / rhs;
140 EXPECT_TRUE(r.IsValid());
141 EXPECT_EQ(r, Scalar(2.5));
142}