v8/test/cctest/test-property-details.cc

73 lines
2.2 KiB
C++
Raw Normal View History

// Copyright 2021 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <limits>
#include "src/objects/property-details.h"
#include "test/cctest/cctest.h"
namespace v8 {
namespace internal {
namespace {
std::vector<PropertyDetails> make_details() {
std::vector<PropertyDetails> result;
for (PropertyKind kind : {PropertyKind::kData, PropertyKind::kAccessor}) {
for (PropertyConstness constness :
{PropertyConstness::kConst, PropertyConstness::kMutable}) {
for (PropertyCellType cell_type :
{PropertyCellType::kConstant, PropertyCellType::kConstantType,
PropertyCellType::kMutable, PropertyCellType::kUndefined,
PropertyCellType::kNoCell}) {
for (int attrs = 0; attrs < 8; ++attrs) {
PropertyAttributes attributes =
static_cast<PropertyAttributes>(attrs);
PropertyDetails details(kind, attributes, cell_type);
details = details.CopyWithConstness(constness);
result.push_back(details);
}
}
}
}
return result;
}
} // namespace
#ifndef DEBUG
// This test will trigger a DCHECK failure in debug mode. We must ensure that in
// release mode, the enum index doesn't interfere with other fields once it
// becomes too large.
TEST(ExceedMaxEnumerationIndex) {
int too_large_enum_index = std::numeric_limits<int>::max();
for (PropertyDetails d : make_details()) {
PropertyDetails copy(d);
d = d.set_index(too_large_enum_index);
CHECK_EQ(copy.kind(), d.kind());
CHECK_EQ(copy.location(), d.location());
CHECK_EQ(copy.attributes(), d.attributes());
CHECK_EQ(copy.cell_type(), d.cell_type());
CHECK_EQ(PropertyDetails::DictionaryStorageField::kMax,
d.dictionary_index());
}
}
#endif
TEST(AsByte) {
for (PropertyDetails original : make_details()) {
if (original.cell_type() != PropertyCellType::kNoCell) continue;
uint8_t as_byte = original.ToByte();
PropertyDetails from_byte = PropertyDetails::FromByte(as_byte);
CHECK_EQ(original, from_byte);
}
}
} // namespace internal
} // namespace v8