// Copyright (2019-2023) Paul Scherrer Institute #include #include "../acquisition_device/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(); REQUIRE(memcmp(device.GetDeviceOutput(0,0)->pixels, module_data.data(), RAW_MODULE_SIZE * sizeof(uint16_t)) == 0); REQUIRE(memcmp(device.GetDeviceOutput(0,1)->pixels, module_data.data(), RAW_MODULE_SIZE * sizeof(uint16_t)) == 0); REQUIRE(memcmp(device.GetDeviceOutput(3,0)->pixels, module_data.data(), RAW_MODULE_SIZE * sizeof(uint16_t)) == 0); REQUIRE(memcmp(device.GetDeviceOutput(4,1)->pixels, 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(CompressionAlgorithm::NO_COMPRESSION); AcquisitionDeviceGroup aq_devices; for (int i = 0; i < x.GetDataStreamsNum(); i++) { for (auto &j: test_frame) j = dist(g1); auto test = std::make_unique(i, 64); test->EnableLogging(&logger); test->SetCustomInternalGeneratorFrame(test_frame); aq_devices.Add(std::move(test)); } JFJochReceiverOutput 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(CompressionAlgorithm::BSHUF_ZSTD); AcquisitionDeviceGroup aq_devices; for (int i = 0; i < x.GetDataStreamsNum(); i++) { auto test = std::make_unique(i, 64); test->EnableLogging(&logger); aq_devices.Add(std::move(test)); } JFJochReceiverOutput 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); }