Skip to content

Commit e7b32bb

Browse files
committed
🐛 Fix some bugs in the test querying operation data
1 parent 591d826 commit e7b32bb

File tree

3 files changed

+55
-53
lines changed

3 files changed

+55
-53
lines changed

include/mqt-core/na/device/Generator.hpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -251,13 +251,14 @@ struct Device {
251251
};
252252

253253
/// @brief The unit of measurement for lengths in the device.
254-
Unit lengthUnit;
254+
Unit lengthUnit = {1.0, "um"}; ///< Default is micrometers (um).
255255
/// @brief The unit of measurement for time in the device.
256-
Unit durationUnit;
256+
Unit durationUnit = {1.0, "us"}; ///< Default is microseconds (us).
257257

258258
// Before we used the macro NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT here,
259259
// too. Now, we added an id to shuttling units that must be initialized
260-
// in a custom routine, so we can only use the serialize macro.
260+
// in a custom routine, so we can only use the serialize macro. Additionally,
261+
// we check here whether the units are valid SI units.
261262
// NOLINTNEXTLINE(misc-include-cleaner)
262263
NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE(
263264
Device, name, numQubits, traps, minAtomDistance,
@@ -269,7 +270,7 @@ struct Device {
269270
// and must not be changed
270271
template <typename BasicJsonType>
271272
// NOLINTNEXTLINE(readability-identifier-naming)
272-
friend void from_json(const BasicJsonType& json, Device& device) {
273+
friend auto from_json(const BasicJsonType& json, Device& device) -> void {
273274
const Device defaultDevice{};
274275
device.name = !json.is_null() ? json.value("name", defaultDevice.name)
275276
: defaultDevice.name;
@@ -311,9 +312,21 @@ struct Device {
311312
device.lengthUnit = !json.is_null()
312313
? json.value("lengthUnit", defaultDevice.lengthUnit)
313314
: defaultDevice.lengthUnit;
315+
if (device.lengthUnit.unit != "mm" && device.lengthUnit.unit != "um" &&
316+
device.lengthUnit.unit != "nm") {
317+
throw std::runtime_error(
318+
"Invalid length unit: " + device.lengthUnit.unit +
319+
". Supported units are: mm, um, nm.");
320+
}
314321
device.durationUnit =
315-
!json.is_null() ? json.value("timeUnit", defaultDevice.durationUnit)
322+
!json.is_null() ? json.value("durationUnit", defaultDevice.durationUnit)
316323
: defaultDevice.durationUnit;
324+
if (device.durationUnit.unit != "ms" && device.durationUnit.unit != "us" &&
325+
device.durationUnit.unit != "ns") {
326+
throw std::runtime_error(
327+
"Invalid duration unit: " + device.durationUnit.unit +
328+
". Supported units are: ms, us, ns.");
329+
}
317330
}
318331
};
319332

test/na/device/test_device.cpp

Lines changed: 31 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -401,13 +401,13 @@ TEST_F(QDMISpecificationTest, QueryDeviceLengthUnit) {
401401
nullptr),
402402
QDMI_SUCCESS);
403403
EXPECT_THAT(value, testing::AnyOf("nm", "um", "mm"));
404-
double scaleFactor = .0;
404+
double scaleFactor = 0.;
405405
const auto result = MQT_NA_QDMI_device_session_query_device_property(
406406
session, QDMI_DEVICE_PROPERTY_LENGTHSCALEFACTOR, sizeof(double),
407407
&scaleFactor, nullptr);
408408
EXPECT_THAT(result, testing::AnyOf(QDMI_SUCCESS, QDMI_ERROR_NOTSUPPORTED));
409409
if (result == QDMI_SUCCESS) {
410-
EXPECT_GT(scaleFactor, .0);
410+
EXPECT_GT(scaleFactor, 0.);
411411
}
412412
}
413413

@@ -422,13 +422,13 @@ TEST_F(QDMISpecificationTest, QueryDeviceDurationUnit) {
422422
nullptr),
423423
QDMI_SUCCESS);
424424
EXPECT_THAT(value, testing::AnyOf("ns", "us", "ms"));
425-
double scaleFactor = .0;
425+
double scaleFactor = 0.;
426426
const auto result = MQT_NA_QDMI_device_session_query_device_property(
427427
session, QDMI_DEVICE_PROPERTY_DURATIONSCALEFACTOR, sizeof(double),
428428
&scaleFactor, nullptr);
429429
EXPECT_THAT(result, testing::AnyOf(QDMI_SUCCESS, QDMI_ERROR_NOTSUPPORTED));
430430
if (result == QDMI_SUCCESS) {
431-
EXPECT_GT(scaleFactor, .0);
431+
EXPECT_GT(scaleFactor, 0.);
432432
}
433433
}
434434

@@ -595,6 +595,17 @@ TEST_F(NADeviceTest, QueryOperationData) {
595595
std::vector<MQT_NA_QDMI_Operation> operations;
596596
EXPECT_NO_THROW(operations = queryOperations(session));
597597
for (auto* operation : operations) {
598+
size_t nameSize = 0;
599+
ASSERT_EQ(MQT_NA_QDMI_device_session_query_operation_property(
600+
session, operation, 0, nullptr, 0, nullptr,
601+
QDMI_OPERATION_PROPERTY_NAME, 0, nullptr, &nameSize),
602+
QDMI_SUCCESS);
603+
std::string name(nameSize - 1, '\0');
604+
EXPECT_EQ(MQT_NA_QDMI_device_session_query_operation_property(
605+
session, operation, 0, nullptr, 0, nullptr,
606+
QDMI_OPERATION_PROPERTY_NAME, nameSize, name.data(), nullptr),
607+
QDMI_SUCCESS);
608+
std::cout << "Querying operation: " << name << "\n";
598609
auto result = MQT_NA_QDMI_device_session_query_operation_property(
599610
session, operation, 0, nullptr, 0, nullptr,
600611
QDMI_OPERATION_PROPERTY_DURATION, sizeof(uint64_t), &duration, nullptr);
@@ -609,8 +620,8 @@ TEST_F(NADeviceTest, QueryOperationData) {
609620
EXPECT_THAT(result, testing::AnyOf(QDMI_SUCCESS, QDMI_ERROR_NOTSUPPORTED));
610621
if (result == QDMI_SUCCESS) {
611622
isFidelitySupported = true;
612-
EXPECT_GT(fidelity, .0);
613-
EXPECT_THAT(fidelity, testing::IsBetween(.0, .1));
623+
EXPECT_GT(fidelity, 0.);
624+
EXPECT_THAT(fidelity, testing::IsBetween(0., 1.));
614625
}
615626
result = MQT_NA_QDMI_device_session_query_operation_property(
616627
session, operation, 0, nullptr, 0, nullptr,
@@ -633,10 +644,12 @@ TEST_F(NADeviceTest, QueryOperationData) {
633644
EXPECT_EQ(isDurationSupported, isFidelitySupported);
634645
// isMeanShuttlingSpeedSupported <==> not isDurationSupported
635646
EXPECT_EQ(isMeanShuttlingSpeedSupported, !isDurationSupported);
636-
// isNumQubitsSupported ==> isMeanShuttlingSpeedSupported
637-
EXPECT_TRUE(!isNumQubitsSupported || isMeanShuttlingSpeedSupported);
647+
// isMeanShuttlingSpeedSupported ==> not isNumQubitsSupported
648+
EXPECT_TRUE(!isMeanShuttlingSpeedSupported || isNumQubitsSupported);
638649
// isMeanShuttlingSpeedSupported ==> isZoned
639650
EXPECT_TRUE(!isMeanShuttlingSpeedSupported || isZoned);
651+
// not isZoned ==> isNumQubitsSupported
652+
EXPECT_TRUE(!isZoned || isNumQubitsSupported);
640653
EXPECT_EQ(MQT_NA_QDMI_device_session_query_operation_property(
641654
session, operation, 0, nullptr, 0, nullptr,
642655
QDMI_OPERATION_PROPERTY_PARAMETERSNUM, sizeof(size_t),
@@ -655,20 +668,13 @@ TEST_F(NADeviceTest, QueryOperationData) {
655668
if (numQubits == 1) {
656669
std::unordered_set<MQT_NA_QDMI_Site> supportedSites;
657670
for (const auto& site : sites) {
658-
size_t nameSize = 0;
659671
result = MQT_NA_QDMI_device_session_query_operation_property(
660672
session, operation, 1, &site, 0, nullptr,
661-
QDMI_OPERATION_PROPERTY_NAME, 0, nullptr, &nameSize);
673+
QDMI_OPERATION_PROPERTY_NAME, 0, nullptr, nullptr);
662674
ASSERT_THAT(result,
663675
testing::AnyOf(QDMI_SUCCESS, QDMI_ERROR_NOTSUPPORTED));
664676
if (result == QDMI_SUCCESS) {
665677
supportedSites.emplace(site);
666-
std::string name(nameSize - 1, '\0');
667-
EXPECT_EQ(MQT_NA_QDMI_device_session_query_operation_property(
668-
session, operation, 0, nullptr, 0, nullptr,
669-
QDMI_OPERATION_PROPERTY_NAME, nameSize, name.data(),
670-
nullptr),
671-
QDMI_SUCCESS);
672678
bool isZone = false;
673679
EXPECT_EQ(MQT_NA_QDMI_device_session_query_site_property(
674680
session, site, QDMI_SITE_PROPERTY_ISZONE, sizeof(bool),
@@ -734,7 +740,8 @@ TEST_F(NADeviceTest, QueryOperationData) {
734740
EXPECT_EQ(MQT_NA_QDMI_device_session_query_operation_property(
735741
session, operation, 0, nullptr, 0, nullptr,
736742
QDMI_OPERATION_PROPERTY_SITES, sitesSize,
737-
queriedSupportedSitesVec.data(), nullptr),
743+
static_cast<void*>(queriedSupportedSitesVec.data()),
744+
nullptr),
738745
QDMI_SUCCESS);
739746
const std::unordered_set queriedSupportedSitesSet(
740747
queriedSupportedSitesVec.cbegin(), queriedSupportedSitesVec.cend());
@@ -763,11 +770,10 @@ TEST_F(NADeviceTest, QueryOperationData) {
763770
for (const auto& site2 : sites) {
764771
if (site1 != site2) {
765772
const std::pair sitePair{site1, site2};
766-
size_t nameSize = 0;
767773
result = MQT_NA_QDMI_device_session_query_operation_property(
768774
session, operation, 2,
769775
reinterpret_cast<const MQT_NA_QDMI_Site*>(&sitePair), 0,
770-
nullptr, QDMI_OPERATION_PROPERTY_NAME, 0, nullptr, &nameSize);
776+
nullptr, QDMI_OPERATION_PROPERTY_NAME, 0, nullptr, nullptr);
771777
ASSERT_THAT(result, testing::AnyOf(QDMI_SUCCESS,
772778
QDMI_ERROR_NOTSUPPORTED));
773779
if (result == QDMI_SUCCESS) {
@@ -778,12 +784,6 @@ TEST_F(NADeviceTest, QueryOperationData) {
778784
} else {
779785
supportedSites.emplace(sitePair.second, sitePair.first);
780786
}
781-
std::string name(nameSize - 1, '\0');
782-
EXPECT_EQ(MQT_NA_QDMI_device_session_query_operation_property(
783-
session, operation, 0, nullptr, 0, nullptr,
784-
QDMI_OPERATION_PROPERTY_NAME, nameSize,
785-
name.data(), nullptr),
786-
QDMI_SUCCESS);
787787
bool isZone = false;
788788
EXPECT_EQ(MQT_NA_QDMI_device_session_query_site_property(
789789
session, sitePair.first,
@@ -882,30 +882,23 @@ TEST_F(NADeviceTest, QueryOperationData) {
882882
&blockingRadius, nullptr),
883883
QDMI_SUCCESS);
884884
EXPECT_GE(blockingRadius, interactionRadius);
885-
double idlingFidelity = .0;
885+
double idlingFidelity = 0.;
886886
EXPECT_EQ(MQT_NA_QDMI_device_session_query_operation_property(
887887
session, operation, 0, nullptr, 0, nullptr,
888-
QDMI_OPERATION_PROPERTY_IDLINGFIDELITY, 0, nullptr,
889-
nullptr),
888+
QDMI_OPERATION_PROPERTY_IDLINGFIDELITY, sizeof(double),
889+
&idlingFidelity, nullptr),
890890
QDMI_SUCCESS);
891-
EXPECT_GT(idlingFidelity, .0);
892-
EXPECT_THAT(idlingFidelity, testing::IsBetween(.0, .1));
891+
EXPECT_GT(idlingFidelity, 0.);
892+
EXPECT_THAT(idlingFidelity, testing::IsBetween(0., 1.));
893893
std::unordered_set<MQT_NA_QDMI_Site> supportedSites;
894894
for (const auto& site : sites) {
895-
size_t nameSize = 0;
896895
result = MQT_NA_QDMI_device_session_query_operation_property(
897896
session, operation, 1, &site, 0, nullptr,
898-
QDMI_OPERATION_PROPERTY_NAME, 0, nullptr, &nameSize);
897+
QDMI_OPERATION_PROPERTY_NAME, 0, nullptr, nullptr);
899898
ASSERT_THAT(result,
900899
testing::AnyOf(QDMI_SUCCESS, QDMI_ERROR_NOTSUPPORTED));
901900
if (result == QDMI_SUCCESS) {
902901
supportedSites.emplace(site);
903-
std::string name(nameSize - 1, '\0');
904-
EXPECT_EQ(MQT_NA_QDMI_device_session_query_operation_property(
905-
session, operation, 0, nullptr, 0, nullptr,
906-
QDMI_OPERATION_PROPERTY_NAME, nameSize, name.data(),
907-
nullptr),
908-
QDMI_SUCCESS);
909902
bool isZone = false;
910903
EXPECT_EQ(MQT_NA_QDMI_device_session_query_site_property(
911904
session, site, QDMI_SITE_PROPERTY_ISZONE,

test/na/device/test_generator.cpp

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,9 @@ TEST(GeneratorTest, WriteJSONSchema) {
5353
testPopulation(json);
5454
}
5555

56-
TEST(GeneratorTest, TimeUnitNanosecond) {
56+
TEST(GeneratorTest, DurationUnitNanosecond) {
5757
std::istringstream is(R"({
58-
"timeUnit": {
58+
"durationUnit": {
5959
"scaleFactor": 5,
6060
"unit": "ns"
6161
}
@@ -66,16 +66,14 @@ TEST(GeneratorTest, TimeUnitNanosecond) {
6666
EXPECT_EQ(device.durationUnit.unit, "ns");
6767
}
6868

69-
TEST(GeneratorTest, TimeUnitInvalid) {
69+
TEST(GeneratorTest, DurationUnitInvalid) {
7070
std::istringstream is(R"({
71-
"timeUnit": {
71+
"durationUnit": {
7272
"scaleFactor": 1,
7373
"unit": "ts"
7474
}
7575
})");
76-
Device device;
77-
ASSERT_NO_THROW(device = readJSON(is));
78-
EXPECT_THROW(writeHeader(device, std::cout), std::runtime_error);
76+
EXPECT_THROW(std::ignore = readJSON(is), std::runtime_error);
7977
}
8078

8179
TEST(GeneratorTest, LengthUnitNanometer) {
@@ -98,9 +96,7 @@ TEST(GeneratorTest, LengthUnitInvalid) {
9896
"unit": "tm"
9997
}
10098
})");
101-
Device device;
102-
ASSERT_NO_THROW(device = readJSON(is));
103-
EXPECT_THROW(writeHeader(device, std::cout), std::runtime_error);
99+
EXPECT_THROW(std::ignore = readJSON(is), std::runtime_error);
104100
}
105101

106102
} // namespace na

0 commit comments

Comments
 (0)