// Test PC note serialization void TestPCnoteSerialization() //---------------------------- { theApp.OnFileNewMPT(); CMainFrame* pMainFrm = CMainFrame::GetMainFrame(); if(pMainFrm == nullptr) throw(std::runtime_error("pMainFrm is nullptr")); CModDoc* pModDoc = pMainFrm->GetActiveDoc(); if(pModDoc == nullptr) throw(std::runtime_error("pModdoc is nullptr")); module_renderer* pSndFile = pModDoc->GetSoundFile(); if(pSndFile == nullptr) throw(std::runtime_error("pSndFile is nullptr")); // Set maximum number of channels. pModDoc->ReArrangeChannels(std::vector<modplug::tracker::chnindex_t>(ModSpecs::mptm.channelsMax , 0)); pSndFile->Patterns.Remove(0); pSndFile->Patterns.Insert(0, ModSpecs::mptm.patternRowsMin); pSndFile->Patterns.Insert(1, 64); GenerateCommands(pSndFile->Patterns[1], 0.3, 0.3); pSndFile->Patterns.Insert(2, ModSpecs::mptm.patternRowsMax); GenerateCommands(pSndFile->Patterns[2], 0.5, 0.5); // vector<modplug::tracker::modevent_t> pat[3]; const size_t numCommands[] = { pSndFile->GetNumChannels() * pSndFile->Patterns[0].GetNumRows(), pSndFile->GetNumChannels() * pSndFile->Patterns[1].GetNumRows(), pSndFile->GetNumChannels() * pSndFile->Patterns[2].GetNumRows() }; pat[0].resize(numCommands[0]); pat[1].resize(numCommands[1]); pat[2].resize(numCommands[2]); for(size_t i = 0; i<3; i++) // Copy pattern data for comparison. { CPattern::const_iterator iter = pSndFile->Patterns[i].Begin(); for(size_t j = 0; j < numCommands[i]; j++, iter++) pat[i][j] = *iter; } std::strstream mem; WriteModPatterns(mem, pSndFile->Patterns); VERIFY_EQUAL_NONCONT( mem.good(), true ); // Clear patterns. pSndFile->Patterns[0].ClearCommands(); pSndFile->Patterns[1].ClearCommands(); pSndFile->Patterns[2].ClearCommands(); // Read data back. ReadModPatterns(mem, pSndFile->Patterns); // Compare. VERIFY_EQUAL_NONCONT( pSndFile->Patterns[0].GetNumRows(), ModSpecs::mptm.patternRowsMin); VERIFY_EQUAL_NONCONT( pSndFile->Patterns[1].GetNumRows(), 64); VERIFY_EQUAL_NONCONT( pSndFile->Patterns[2].GetNumRows(), ModSpecs::mptm.patternRowsMax); for(size_t i = 0; i < 3; i++) { bool bPatternDataMatch = true; CPattern::const_iterator iter = pSndFile->Patterns[i].Begin(); for(size_t j = 0; j < numCommands[i]; j++, iter++) { if(pat[i][j] != *iter) { bPatternDataMatch = false; break; } } VERIFY_EQUAL( bPatternDataMatch, true); } pModDoc->OnCloseDocument(); }