/// Synchronizes data stream by finding the tag sequence. Called /// internally on the first buffer write. bool Sync( ) { int i = 0; int j = 0; bool found = false; // we have to assume the user has written samples before syncing writeIndex_ = writeSize_; // search for data tag for ( i = 0; i < BUFFER_SIZE; ++i ) { if ( buffer_[i] == tags_[j] ) { found = true; readIndex_ = i; for ( j = 1; j < tags_.size(); ++j ) { if ( buffer_[i+j] != tags_[j] ) found = false; } break; } } bufferLevel_ = writeSize_ - readIndex_; isSynchronized_ = true; return found; }
TEST_F(ProjectFixture, DataPointTagRecords) { // create Analysis with one DataPoint with one Tag ("test tag") analysis::Problem problem("problem",analysis::VariableVector(),runmanager::Workflow()); FileReference seed(toPath("in.osm")); analysis::Analysis analysis("analysis",problem,seed); analysis::DataPoint dataPoint = problem.createDataPoint(std::vector<QVariant>()).get(); dataPoint.addTag("test tag"); analysis.addDataPoint(dataPoint); // make sure tag records follow data points around. // trying to replicate issue where data point tag records get repointed to // file reference record with id 0. { // save analysis to a new database ProjectDatabase database = getCleanDatabase("DataPointTagRecords"); AnalysisRecord analysisRecord(analysis,database); database.save(); ASSERT_EQ(1u,analysisRecord.dataPointRecords().size()); DataPointRecord dataPointRecord = analysisRecord.dataPointRecords()[0]; ASSERT_EQ(1u,dataPointRecord.tagRecords().size()); TagRecord tagRecord = dataPointRecord.tagRecords()[0]; EXPECT_EQ("test tag",tagRecord.name()); analysis::DataPoint dataPoint = dataPointRecord.dataPoint(); ASSERT_EQ(1u,dataPoint.tags().size()); EXPECT_EQ("test tag",dataPoint.tags()[0].name()); analysis::Analysis analysis = analysisRecord.analysis(); ASSERT_EQ(1u,analysis.dataPoints().size()); dataPoint = analysis.dataPoints()[0]; ASSERT_EQ(1u,dataPoint.tags().size()); EXPECT_EQ("test tag",dataPoint.tags()[0].name()); } NameFinder<TagRecord> testRecordFinder("test tag"); NameFinder<TagRecord> anotherTestRecordFinder("another test"); NameFinder<Tag> testTagFinder("test tag"); NameFinder<Tag> anotherTestTagFinder("another test"); { ProjectDatabase database = getExistingDatabase("DataPointTagRecords"); ASSERT_EQ(1u,AnalysisRecord::getAnalysisRecords(database).size()); AnalysisRecord analysisRecord = AnalysisRecord::getAnalysisRecords(database)[0]; ASSERT_EQ(1u,analysisRecord.dataPointRecords().size()); DataPointRecord dataPointRecord = analysisRecord.dataPointRecords()[0]; ASSERT_EQ(1u,dataPointRecord.tagRecords().size()); TagRecord tagRecord = dataPointRecord.tagRecords()[0]; EXPECT_EQ("test tag",tagRecord.name()); analysis::DataPoint dataPoint = dataPointRecord.dataPoint(); ASSERT_EQ(1u,dataPoint.tags().size()); EXPECT_EQ("test tag",dataPoint.tags()[0].name()); analysis::Analysis analysis = analysisRecord.analysis(); ASSERT_EQ(1u,analysis.dataPoints().size()); dataPoint = analysis.dataPoints()[0]; ASSERT_EQ(1u,dataPoint.tags().size()); EXPECT_EQ("test tag",dataPoint.tags()[0].name()); // adding a second tag and resaving the analysis dataPoint.addTag("another test"); analysisRecord = AnalysisRecord(analysis,database); bool test = database.save(); EXPECT_TRUE(test); ASSERT_EQ(1u,analysisRecord.dataPointRecords().size()); dataPointRecord = analysisRecord.dataPointRecords()[0]; TagRecordVector tagRecords = dataPointRecord.tagRecords(); EXPECT_EQ(2u,tagRecords.size()); EXPECT_FALSE(std::find_if(tagRecords.begin(),tagRecords.end(),testRecordFinder) == tagRecords.end()); EXPECT_FALSE(std::find_if(tagRecords.begin(),tagRecords.end(),anotherTestRecordFinder) == tagRecords.end()); dataPoint = dataPointRecord.dataPoint(); TagVector tags = dataPoint.tags(); EXPECT_EQ(2u,tags.size()); EXPECT_FALSE(std::find_if(tags.begin(),tags.end(),testTagFinder) == tags.end()); EXPECT_FALSE(std::find_if(tags.begin(),tags.end(),anotherTestTagFinder) == tags.end()); analysis = analysisRecord.analysis(); ASSERT_EQ(1u,analysis.dataPoints().size()); dataPoint = analysis.dataPoints()[0]; tags = dataPoint.tags(); EXPECT_EQ(2u,tags.size()); EXPECT_FALSE(std::find_if(tags.begin(),tags.end(),testTagFinder) == tags.end()); EXPECT_FALSE(std::find_if(tags.begin(),tags.end(),anotherTestTagFinder) == tags.end()); tagRecords = TagRecord::getTagRecords(database); EXPECT_EQ(2u,tagRecords.size()); EXPECT_FALSE(std::find_if(tagRecords.begin(),tagRecords.end(),testRecordFinder) == tagRecords.end()); EXPECT_FALSE(std::find_if(tagRecords.begin(),tagRecords.end(),anotherTestRecordFinder) == tagRecords.end()); } { ProjectDatabase database = getExistingDatabase("DataPointTagRecords"); ASSERT_EQ(1u,AnalysisRecord::getAnalysisRecords(database).size()); AnalysisRecord analysisRecord = AnalysisRecord::getAnalysisRecords(database)[0]; ASSERT_EQ(1u,analysisRecord.dataPointRecords().size()); DataPointRecord dataPointRecord = analysisRecord.dataPointRecords()[0]; TagRecordVector tagRecords = dataPointRecord.tagRecords(); EXPECT_EQ(2u,tagRecords.size()); EXPECT_FALSE(std::find_if(tagRecords.begin(),tagRecords.end(),testRecordFinder) == tagRecords.end()); EXPECT_FALSE(std::find_if(tagRecords.begin(),tagRecords.end(),anotherTestRecordFinder) == tagRecords.end()); dataPoint = dataPointRecord.dataPoint(); TagVector tags = dataPoint.tags(); EXPECT_FALSE(std::find_if(tags.begin(),tags.end(),testTagFinder) == tags.end()); EXPECT_FALSE(std::find_if(tags.begin(),tags.end(),anotherTestTagFinder) == tags.end()); analysis = analysisRecord.analysis(); ASSERT_EQ(1u,analysis.dataPoints().size()); dataPoint = analysis.dataPoints()[0]; tags = dataPoint.tags(); EXPECT_FALSE(std::find_if(tags.begin(),tags.end(),testTagFinder) == tags.end()); EXPECT_FALSE(std::find_if(tags.begin(),tags.end(),anotherTestTagFinder) == tags.end()); } }