X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=test%2Fdata%2Flogicsnapshot.cpp;h=4ad23aa4b2a16c598fcb9798933a24d1b6f919a2;hp=1c536791b7a3f746a9ae621cc39c62553b21fae7;hb=2acdb232d6bb452cfdfaea3ef5218fb4da592329;hpb=1b1ec774978b65209ce2b454cbf81da499b797d2 diff --git a/test/data/logicsnapshot.cpp b/test/data/logicsnapshot.cpp index 1c536791..4ad23aa4 100644 --- a/test/data/logicsnapshot.cpp +++ b/test/data/logicsnapshot.cpp @@ -20,16 +20,14 @@ #include -#define __STDC_LIMIT_MACROS #include #include -#include "../../pv/data/logicsnapshot.h" - -using namespace std; +#include using pv::data::LogicSnapshot; +using std::vector; BOOST_AUTO_TEST_SUITE(LogicSnapshotTest) @@ -76,7 +74,7 @@ BOOST_AUTO_TEST_CASE(Basic) BOOST_CHECK(s.get_sample_count() == 0); for (unsigned int i = 0; i < LogicSnapshot::ScaleStepCount; i++) { - const LogicSnapshot::MipMapLevel &m = s._mip_map[i]; + const LogicSnapshot::MipMapLevel &m = s.mip_map_[i]; BOOST_CHECK_EQUAL(m.length, 0); BOOST_CHECK_EQUAL(m.data_length, 0); BOOST_CHECK(m.data == NULL); @@ -90,7 +88,7 @@ BOOST_AUTO_TEST_CASE(Basic) // There should not be enough samples to have a single mip map sample for (unsigned int i = 0; i < LogicSnapshot::ScaleStepCount; i++) { - const LogicSnapshot::MipMapLevel &m = s._mip_map[i]; + const LogicSnapshot::MipMapLevel &m = s.mip_map_[i]; BOOST_CHECK_EQUAL(m.length, 0); BOOST_CHECK_EQUAL(m.data_length, 0); BOOST_CHECK(m.data == NULL); @@ -101,7 +99,7 @@ BOOST_AUTO_TEST_CASE(Basic) // There should now be enough data for exactly one sample // in mip map level 0, and that sample should be 0 - const LogicSnapshot::MipMapLevel &m0 = s._mip_map[0]; + const LogicSnapshot::MipMapLevel &m0 = s.mip_map_[0]; BOOST_CHECK_EQUAL(m0.length, 1); BOOST_CHECK_EQUAL(m0.data_length, LogicSnapshot::MipMapDataUnit); BOOST_REQUIRE(m0.data != NULL); @@ -110,7 +108,7 @@ BOOST_AUTO_TEST_CASE(Basic) // The higher levels should still be empty for (unsigned int i = 1; i < LogicSnapshot::ScaleStepCount; i++) { - const LogicSnapshot::MipMapLevel &m = s._mip_map[i]; + const LogicSnapshot::MipMapLevel &m = s.mip_map_[i]; BOOST_CHECK_EQUAL(m.length, 0); BOOST_CHECK_EQUAL(m.data_length, 0); BOOST_CHECK(m.data == NULL); @@ -126,7 +124,7 @@ BOOST_AUTO_TEST_CASE(Basic) for (unsigned int i = 2; i < m0.length; i++) BOOST_CHECK_EQUAL(((uint8_t*)m0.data)[i], 0); - const LogicSnapshot::MipMapLevel &m1 = s._mip_map[1]; + const LogicSnapshot::MipMapLevel &m1 = s.mip_map_[1]; BOOST_CHECK_EQUAL(m1.length, 1); BOOST_CHECK_EQUAL(m1.data_length, LogicSnapshot::MipMapDataUnit); BOOST_REQUIRE(m1.data != NULL); @@ -142,7 +140,7 @@ BOOST_AUTO_TEST_CASE(Basic) BOOST_CHECK_EQUAL(edges[0].first, 0); BOOST_CHECK_EQUAL(edges[1].first, 8); BOOST_CHECK_EQUAL(edges[2].first, 16); - BOOST_CHECK_EQUAL(edges[3].first, 255); + BOOST_CHECK_EQUAL(edges[3].first, 256); // Test a subset at high zoom edges.clear(); @@ -152,7 +150,7 @@ BOOST_AUTO_TEST_CASE(Basic) BOOST_CHECK_EQUAL(edges[0].first, 6); BOOST_CHECK_EQUAL(edges[1].first, 8); BOOST_CHECK_EQUAL(edges[2].first, 16); - BOOST_CHECK_EQUAL(edges[3].first, 17); + BOOST_CHECK_EQUAL(edges[3].first, 18); } BOOST_AUTO_TEST_CASE(LargeData) @@ -175,13 +173,13 @@ BOOST_AUTO_TEST_CASE(LargeData) BOOST_CHECK(s.get_sample_count() == Length); // Check mip map level 0 - BOOST_CHECK_EQUAL(s._mip_map[0].length, 62500); - BOOST_CHECK_EQUAL(s._mip_map[0].data_length, + BOOST_CHECK_EQUAL(s.mip_map_[0].length, 62500); + BOOST_CHECK_EQUAL(s.mip_map_[0].data_length, LogicSnapshot::MipMapDataUnit); - BOOST_REQUIRE(s._mip_map[0].data != NULL); + BOOST_REQUIRE(s.mip_map_[0].data != NULL); prev_sample = 0; - for (unsigned int i = 0; i < s._mip_map[0].length;) + for (unsigned int i = 0; i < s.mip_map_[0].length;) { BOOST_TEST_MESSAGE("Testing mip_map[0].data[" << i << "]"); @@ -190,7 +188,7 @@ BOOST_AUTO_TEST_CASE(LargeData) prev_sample ^ sample); prev_sample = sample; - for (int j = 1; i < s._mip_map[0].length && j < 16; j++) + for (int j = 1; i < s.mip_map_[0].length && j < 16; j++) { BOOST_TEST_MESSAGE("Testing mip_map[0].data[" << i << "]"); BOOST_CHECK_EQUAL(s.get_subsample(0, i++) & 0xFF, 0); @@ -198,13 +196,13 @@ BOOST_AUTO_TEST_CASE(LargeData) } // Check mip map level 1 - BOOST_CHECK_EQUAL(s._mip_map[1].length, 3906); - BOOST_CHECK_EQUAL(s._mip_map[1].data_length, + BOOST_CHECK_EQUAL(s.mip_map_[1].length, 3906); + BOOST_CHECK_EQUAL(s.mip_map_[1].data_length, LogicSnapshot::MipMapDataUnit); - BOOST_REQUIRE(s._mip_map[1].data != NULL); + BOOST_REQUIRE(s.mip_map_[1].data != NULL); prev_sample = 0; - for (unsigned int i = 0; i < s._mip_map[1].length; i++) + for (unsigned int i = 0; i < s.mip_map_[1].length; i++) { BOOST_TEST_MESSAGE("Testing mip_map[1].data[" << i << "]"); @@ -216,13 +214,13 @@ BOOST_AUTO_TEST_CASE(LargeData) } // Check mip map level 2 - BOOST_CHECK_EQUAL(s._mip_map[2].length, 244); - BOOST_CHECK_EQUAL(s._mip_map[2].data_length, + BOOST_CHECK_EQUAL(s.mip_map_[2].length, 244); + BOOST_CHECK_EQUAL(s.mip_map_[2].data_length, LogicSnapshot::MipMapDataUnit); - BOOST_REQUIRE(s._mip_map[2].data != NULL); + BOOST_REQUIRE(s.mip_map_[2].data != NULL); prev_sample = 0; - for (unsigned int i = 0; i < s._mip_map[2].length; i++) + for (unsigned int i = 0; i < s.mip_map_[2].length; i++) { BOOST_TEST_MESSAGE("Testing mip_map[2].data[" << i << "]"); @@ -234,19 +232,19 @@ BOOST_AUTO_TEST_CASE(LargeData) } // Check mip map level 3 - BOOST_CHECK_EQUAL(s._mip_map[3].length, 15); - BOOST_CHECK_EQUAL(s._mip_map[3].data_length, + BOOST_CHECK_EQUAL(s.mip_map_[3].length, 15); + BOOST_CHECK_EQUAL(s.mip_map_[3].data_length, LogicSnapshot::MipMapDataUnit); - BOOST_REQUIRE(s._mip_map[3].data != NULL); + BOOST_REQUIRE(s.mip_map_[3].data != NULL); - for (unsigned int i = 0; i < s._mip_map[3].length; i++) - BOOST_CHECK_EQUAL(*((uint8_t*)s._mip_map[3].data + i), + for (unsigned int i = 0; i < s.mip_map_[3].length; i++) + BOOST_CHECK_EQUAL(*((uint8_t*)s.mip_map_[3].data + i), 0xFF); // Check the higher levels for (unsigned int i = 4; i < LogicSnapshot::ScaleStepCount; i++) { - const LogicSnapshot::MipMapLevel &m = s._mip_map[i]; + const LogicSnapshot::MipMapLevel &m = s.mip_map_[i]; BOOST_CHECK_EQUAL(m.length, 0); BOOST_CHECK_EQUAL(m.data_length, 0); BOOST_CHECK(m.data == NULL); @@ -265,7 +263,7 @@ BOOST_AUTO_TEST_CASE(LargeData) BOOST_CHECK_EQUAL(edges[i].second, i & 1); } - BOOST_CHECK_EQUAL(edges[31].first, 999999); + BOOST_CHECK_EQUAL(edges[31].first, 1000000); // Check in very low zoom case edges.clear(); @@ -300,17 +298,17 @@ BOOST_AUTO_TEST_CASE(Pulses) //----- Check the mip-map -----// // Check mip map level 0 - BOOST_CHECK_EQUAL(s._mip_map[0].length, 12); - BOOST_CHECK_EQUAL(s._mip_map[0].data_length, + BOOST_CHECK_EQUAL(s.mip_map_[0].length, 12); + BOOST_CHECK_EQUAL(s.mip_map_[0].data_length, LogicSnapshot::MipMapDataUnit); - BOOST_REQUIRE(s._mip_map[0].data != NULL); + BOOST_REQUIRE(s.mip_map_[0].data != NULL); - for (unsigned int i = 0; i < s._mip_map[0].length;) { + for (unsigned int i = 0; i < s.mip_map_[0].length;) { BOOST_TEST_MESSAGE("Testing mip_map[0].data[" << i << "]"); BOOST_CHECK_EQUAL(s.get_subsample(0, i++) & 0xFF, 0xFF); for (int j = 1; - i < s._mip_map[0].length && + i < s.mip_map_[0].length && j < Period/LogicSnapshot::MipMapScaleFactor; j++) { BOOST_TEST_MESSAGE( "Testing mip_map[0].data[" << i << "]"); @@ -320,7 +318,7 @@ BOOST_AUTO_TEST_CASE(Pulses) // Check the higher levels are all inactive for (unsigned int i = 1; i < LogicSnapshot::ScaleStepCount; i++) { - const LogicSnapshot::MipMapLevel &m = s._mip_map[i]; + const LogicSnapshot::MipMapLevel &m = s.mip_map_[i]; BOOST_CHECK_EQUAL(m.length, 0); BOOST_CHECK_EQUAL(m.data_length, 0); BOOST_CHECK(m.data == NULL); @@ -348,7 +346,7 @@ BOOST_AUTO_TEST_CASE(LongPulses) //----- Create a LogicSnapshot -----// sr_datafeed_logic logic; logic.unitsize = 8; - logic.length = Length; + logic.length = Length * 8; logic.data = (uint64_t*)new uint64_t[Length]; uint64_t *p = (uint64_t*)logic.data; @@ -364,19 +362,19 @@ BOOST_AUTO_TEST_CASE(LongPulses) //----- Check the mip-map -----// // Check mip map level 0 - BOOST_CHECK_EQUAL(s._mip_map[0].length, 12); - BOOST_CHECK_EQUAL(s._mip_map[0].data_length, + BOOST_CHECK_EQUAL(s.mip_map_[0].length, 12); + BOOST_CHECK_EQUAL(s.mip_map_[0].data_length, LogicSnapshot::MipMapDataUnit); - BOOST_REQUIRE(s._mip_map[0].data != NULL); + BOOST_REQUIRE(s.mip_map_[0].data != NULL); - for (unsigned int i = 0; i < s._mip_map[0].length;) { - for (j = 0; i < s._mip_map[0].length && j < 2; j++) { + for (unsigned int i = 0; i < s.mip_map_[0].length;) { + for (j = 0; i < s.mip_map_[0].length && j < 2; j++) { BOOST_TEST_MESSAGE( "Testing mip_map[0].data[" << i << "]"); BOOST_CHECK_EQUAL(s.get_subsample(0, i++), ~0); } - for (; i < s._mip_map[0].length && + for (; i < s.mip_map_[0].length && j < Period/LogicSnapshot::MipMapScaleFactor; j++) { BOOST_TEST_MESSAGE( "Testing mip_map[0].data[" << i << "]"); @@ -386,7 +384,7 @@ BOOST_AUTO_TEST_CASE(LongPulses) // Check the higher levels are all inactive for (unsigned int i = 1; i < LogicSnapshot::ScaleStepCount; i++) { - const LogicSnapshot::MipMapLevel &m = s._mip_map[i]; + const LogicSnapshot::MipMapLevel &m = s.mip_map_[i]; BOOST_CHECK_EQUAL(m.length, 0); BOOST_CHECK_EQUAL(m.data_length, 0); BOOST_CHECK(m.data == NULL); @@ -403,7 +401,7 @@ BOOST_AUTO_TEST_CASE(LongPulses) BOOST_CHECK_EQUAL(edges[i*2+1].second, false); } - BOOST_CHECK_EQUAL(edges.back().first, Length-1); + BOOST_CHECK_EQUAL(edges.back().first, Length); BOOST_CHECK_EQUAL(edges.back().second, false); //----- Test get_subsampled_edges at a simplified scale -----// @@ -420,7 +418,7 @@ BOOST_AUTO_TEST_CASE(LongPulses) BOOST_CHECK_EQUAL(edges[i+1].second, false); } - BOOST_CHECK_EQUAL(edges.back().first, Length-1); + BOOST_CHECK_EQUAL(edges.back().first, Length); BOOST_CHECK_EQUAL(edges.back().second, false); } @@ -471,5 +469,66 @@ BOOST_AUTO_TEST_CASE(LisaMUsbHid) BOOST_CHECK_EQUAL(edges[edges.size() - 2].second, false); } +/* + * This test checks the rendering of wide data (more than 8 channels) + * Probe signals are either all-high, or all-low, but are interleaved such that + * they would toggle during every sample if treated like 8 channels. + * The packet contains a large number of samples, so the mipmap generation kicks + * in. + * + * The signals should not toggle (have exactly two edges: the start and end) + */ +BOOST_AUTO_TEST_CASE(WideData) +{ + const int Length = 512<<10; + uint16_t *data = new uint16_t[Length]; + + sr_datafeed_logic logic; + logic.unitsize = sizeof(data[0]); + logic.length = Length * sizeof(data[0]); + logic.data = data; + + for (int i = 0; i < Length; i++) + data[i] = 0x0FF0; + + LogicSnapshot s(logic); + + vector edges; + + edges.clear(); + s.get_subsampled_edges(edges, 0, Length-1, 1, 0); + BOOST_CHECK_EQUAL(edges.size(), 2); + + edges.clear(); + s.get_subsampled_edges(edges, 0, Length-1, 1, 8); + BOOST_CHECK_EQUAL(edges.size(), 2); + + // Cleanup + delete [] data; +} + +/* + * This test is a replica of sixteen.sr attached to Bug #33. + */ +BOOST_AUTO_TEST_CASE(Sixteen) +{ + const int Length = 8; + uint16_t data[Length]; + + sr_datafeed_logic logic; + logic.unitsize = sizeof(data[0]); + logic.length = Length * sizeof(data[0]); + logic.data = data; + + for (int i = 0; i < Length; i++) + data[i] = 0xFFFE; + + LogicSnapshot s(logic); + + vector edges; + s.get_subsampled_edges(edges, 0, 2, 0.0004, 1); + + BOOST_CHECK_EQUAL(edges.size(), 2); +} BOOST_AUTO_TEST_SUITE_END()