// Copyright (2019-2023) Paul Scherrer Institute #include #include "../receiver/MockAcquisitionDevice.h" #include "../receiver/JFJochReceiverTest.h" TEST_CASE("MockAcquisitionDevice") { std::vector module_data(RAW_MODULE_SIZE, 765); DiffractionExperiment experiment(DetectorGeometry(8, 2)); experiment.DataStreams(2); experiment.NumTriggers(1).ImagesPerTrigger(5); MockAcquisitionDevice device(0, 128); device.StartAction(experiment); device.AddModule(1,0,module_data.data()); device.AddModule(1,1,module_data.data()); device.AddModule(4,0,module_data.data()); device.AddModule(5,1,module_data.data()); device.Terminate(); device.WaitForActionComplete(); JFJochProtoBuf::AcquisitionDeviceStatistics device_statistics; REQUIRE_NOTHROW(device.SaveStatistics(experiment, device_statistics)); REQUIRE(memcmp(device.GetFrameBuffer(0,0), module_data.data(), RAW_MODULE_SIZE * sizeof(uint16_t)) == 0); REQUIRE(memcmp(device.GetFrameBuffer(0,1), module_data.data(), RAW_MODULE_SIZE * sizeof(uint16_t)) == 0); REQUIRE(memcmp(device.GetFrameBuffer(3,0), module_data.data(), RAW_MODULE_SIZE * sizeof(uint16_t)) == 0); REQUIRE(memcmp(device.GetFrameBuffer(4,1), module_data.data(), RAW_MODULE_SIZE * sizeof(uint16_t)) == 0); } TEST_CASE("JFJochReceiverTest_Raw_MockAcquisitionDevice", "[JFJochReceiver]") { Logger logger("JFJochReceiverTest_Raw_MockAcquisitionDevice"); logger.Verbose(true); std::mt19937 g1(1387); std::uniform_int_distribution dist(0, 65535); DiffractionExperiment x(DetectorGeometry(4)); const uint16_t nthreads = 4; std::vector test_frame(RAW_MODULE_SIZE); x.Mode(DetectorMode::Raw); x.PedestalG0Frames(0).NumTriggers(1).UseInternalPacketGenerator(true) .ImagesPerTrigger(100).DataFileCount(16).PhotonEnergy_keV(12.4).Compression(JFJochProtoBuf::NO_COMPRESSION); std::vector> aq_devices; for (int i = 0; i < x.GetDataStreamsNum(); i++) { for (auto &j: test_frame) j = dist(g1); auto *test = new MockAcquisitionDevice(i, 64); test->EnableLogging(&logger); test->SetCustomInternalGeneratorFrame(test_frame); aq_devices.emplace_back(test); } JFJochProtoBuf::ReceiverOutput output; bool ret; REQUIRE_NOTHROW(ret = JFJochReceiverTest(output, logger, aq_devices, x, nthreads, false)); REQUIRE(ret); REQUIRE(output.efficiency() == 1.0); REQUIRE(output.images_sent() == x.GetImageNum()); REQUIRE(output.compressed_ratio() == 1.0); REQUIRE(output.compressed_size() == x.GetImageNum() * x.GetPixelDepth() * x.GetPixelsNum()); REQUIRE(output.max_image_number_sent() == x.GetImageNum() - 1); REQUIRE(!output.cancelled()); } TEST_CASE("JFJochReceiverTest_Conversion_MockAcquisitionDevice", "[JFJochReceiver]") { Logger logger("JFJochReceiverTest_Conversion"); DiffractionExperiment x(DetectorGeometry(8)); const uint16_t nthreads = 4; x.Mode(DetectorMode::Conversion); x.PedestalG0Frames(0).NumTriggers(1).UseInternalPacketGenerator(true).DataStreams(x.GetModulesNum()) .ImagesPerTrigger(32).DataFileCount(16).PhotonEnergy_keV(12.4).Compression(JFJochProtoBuf::BSHUF_ZSTD); std::vector> aq_devices; for (int i = 0; i < x.GetDataStreamsNum(); i++) { AcquisitionDevice *test; test = new MockAcquisitionDevice(i, 64); test->EnableLogging(&logger); aq_devices.emplace_back(test); } JFJochProtoBuf::ReceiverOutput output; bool ret; REQUIRE_NOTHROW(ret = JFJochReceiverTest(output, logger, aq_devices, x, nthreads, false)); REQUIRE(ret); REQUIRE(output.efficiency() == 1.0); REQUIRE(output.images_sent() == x.GetImageNum()); REQUIRE(!output.cancelled()); }