コード例 #1
0
ファイル: test.cpp プロジェクト: aidush/openmpt
// 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();
}