2016-07-30 23:17:49 +02:00
# include <c++utilities/conversion/stringconversion.h>
# include <c++utilities/tests/testutils.h>
# include <cppunit/extensions/HelperMacros.h>
# include <cppunit/TestFixture.h>
# include <iostream>
using namespace std ;
using namespace TestUtilities ;
using namespace CPPUNIT_NS ;
enum class TagStatus
{
Original ,
TestMetaDataPresent ,
Removed
} ;
/*!
* \ brief The CliTests class tests the command line interface .
*/
class CliTests : public TestFixture
{
CPPUNIT_TEST_SUITE ( CliTests ) ;
# ifdef PLATFORM_UNIX
CPPUNIT_TEST ( testBasicReadingAndWriting ) ;
CPPUNIT_TEST ( testHandlingOfTargets ) ;
CPPUNIT_TEST ( testHandlingOfId3Tags ) ;
CPPUNIT_TEST ( testMultipleFiles ) ;
CPPUNIT_TEST ( testMultipleValuesPerField ) ;
CPPUNIT_TEST ( testHandlingAttachments ) ;
2016-07-31 23:22:22 +02:00
CPPUNIT_TEST ( testDisplayingInfo ) ;
CPPUNIT_TEST ( testExtraction ) ;
CPPUNIT_TEST ( testReadingAndWritingDocumentTitle ) ;
2016-07-30 23:17:49 +02:00
# endif
CPPUNIT_TEST_SUITE_END ( ) ;
public :
void setUp ( ) ;
void tearDown ( ) ;
# ifdef PLATFORM_UNIX
void testBasicReadingAndWriting ( ) ;
void testHandlingOfTargets ( ) ;
void testHandlingOfId3Tags ( ) ;
void testMultipleFiles ( ) ;
void testMultipleValuesPerField ( ) ;
void testHandlingAttachments ( ) ;
2016-07-31 23:22:22 +02:00
void testDisplayingInfo ( ) ;
void testExtraction ( ) ;
void testReadingAndWritingDocumentTitle ( ) ;
2016-07-30 23:17:49 +02:00
# endif
private :
} ;
CPPUNIT_TEST_SUITE_REGISTRATION ( CliTests ) ;
void CliTests : : setUp ( )
{ }
void CliTests : : tearDown ( )
{ }
# ifdef PLATFORM_UNIX
/*!
* \ brief Tests basic reading and writing of tags .
*/
void CliTests : : testBasicReadingAndWriting ( )
{
string stdout , stderr ;
// get specific field
2016-07-31 23:22:22 +02:00
const string mkvFile ( workingCopyPath ( " matroska_wave1/test2.mkv " ) ) ;
2016-07-30 23:17:49 +02:00
const char * const args1 [ ] = { " tageditor " , " get " , " title " , " -f " , mkvFile . data ( ) , nullptr } ;
CPPUNIT_ASSERT_EQUAL ( 0 , execApp ( args1 , stdout , stderr ) ) ;
CPPUNIT_ASSERT ( stderr . empty ( ) ) ;
// context of the following fields is the album (so "Title" means the title of the album)
CPPUNIT_ASSERT ( stdout . find ( " album " ) ! = string : : npos ) ;
CPPUNIT_ASSERT ( stdout . find ( " Title Elephant Dream - test 2 " ) ! = string : : npos ) ;
CPPUNIT_ASSERT ( stdout . find ( " Year 2010 " ) = = string : : npos ) ;
// get all fields
const char * const args2 [ ] = { " tageditor " , " get " , " -f " , mkvFile . data ( ) , nullptr } ;
CPPUNIT_ASSERT_EQUAL ( 0 , execApp ( args2 , stdout , stderr ) ) ;
CPPUNIT_ASSERT ( stderr . empty ( ) ) ;
CPPUNIT_ASSERT ( stdout . find ( " Title Elephant Dream - test 2 " ) ! = string : : npos ) ;
CPPUNIT_ASSERT ( stdout . find ( " Year 2010 " ) ! = string : : npos ) ;
CPPUNIT_ASSERT ( stdout . find ( " Comment Matroska Validation File 2, 100,000 timecode scale, odd aspect ratio, and CRC-32. Codecs are AVC and AAC " ) ! = string : : npos ) ;
// set some fields, keep other field
const char * const args3 [ ] = { " tageditor " , " set " , " title=A new title " , " genre=Testfile " , " -f " , mkvFile . data ( ) , nullptr } ;
CPPUNIT_ASSERT_EQUAL ( 0 , execApp ( args3 , stdout , stderr ) ) ;
CPPUNIT_ASSERT ( stdout . find ( " Changes have been applied " ) ! = string : : npos ) ;
CPPUNIT_ASSERT_EQUAL ( 0 , execApp ( args2 , stdout , stderr ) ) ;
CPPUNIT_ASSERT ( stderr . empty ( ) ) ;
CPPUNIT_ASSERT ( stdout . find ( " Title A new title " ) ! = string : : npos ) ;
CPPUNIT_ASSERT ( stdout . find ( " Year 2010 " ) ! = string : : npos ) ;
CPPUNIT_ASSERT ( stdout . find ( " Comment Matroska Validation File 2, 100,000 timecode scale, odd aspect ratio, and CRC-32. Codecs are AVC and AAC " ) ! = string : : npos ) ;
CPPUNIT_ASSERT ( stdout . find ( " Genre Testfile " ) ! = string : : npos ) ;
// set some fields, discard other
const char * const args4 [ ] = { " tageditor " , " set " , " title=Foo " , " artist=Bar " , " --remove-other-fields " , " -f " , mkvFile . data ( ) , nullptr } ;
CPPUNIT_ASSERT_EQUAL ( 0 , execApp ( args4 , stdout , stderr ) ) ;
CPPUNIT_ASSERT_EQUAL ( 0 , execApp ( args2 , stdout , stderr ) ) ;
CPPUNIT_ASSERT ( stderr . empty ( ) ) ;
CPPUNIT_ASSERT ( stdout . find ( " Title Foo " ) ! = string : : npos ) ;
CPPUNIT_ASSERT ( stdout . find ( " Artist Bar " ) ! = string : : npos ) ;
CPPUNIT_ASSERT ( stdout . find ( " Year " ) = = string : : npos ) ;
CPPUNIT_ASSERT ( stdout . find ( " Comment " ) = = string : : npos ) ;
CPPUNIT_ASSERT ( stdout . find ( " Genre " ) = = string : : npos ) ;
}
/*!
* \ brief Tests adding and removing of targets .
*/
void CliTests : : testHandlingOfTargets ( )
{
string stdout , stderr ;
2016-07-31 23:22:22 +02:00
const string mkvFile ( workingCopyPath ( " matroska_wave1/test2.mkv " ) ) ;
2016-07-30 23:17:49 +02:00
const char * const args1 [ ] = { " tageditor " , " get " , " -f " , mkvFile . data ( ) , nullptr } ;
// add song title (title field for tag with level 30)
const char * const args2 [ ] = { " tageditor " , " set " , " target-level=30 " , " title=The song title " , " genre=The song genre " , " target-level=50 " , " genre=The album genre " , " -f " , mkvFile . data ( ) , nullptr } ;
CPPUNIT_ASSERT_EQUAL ( 0 , execApp ( args2 , stdout , stderr ) ) ;
CPPUNIT_ASSERT_EQUAL ( 0 , execApp ( args1 , stdout , stderr ) ) ;
size_t songPos , albumPos ;
CPPUNIT_ASSERT ( ( songPos = stdout . find ( " song " ) ) ! = string : : npos ) ;
CPPUNIT_ASSERT ( ( albumPos = stdout . find ( " album " ) ) ! = string : : npos ) ;
CPPUNIT_ASSERT ( stdout . find ( " Title The song title " ) > songPos ) ;
CPPUNIT_ASSERT ( stdout . find ( " Genre The song genre " ) > songPos ) ;
CPPUNIT_ASSERT ( stdout . find ( " Title Elephant Dream - test 2 " ) > albumPos ) ;
CPPUNIT_ASSERT ( stdout . find ( " Genre The album genre " ) > albumPos ) ;
// remove tags targeting level 30 and 50 and add new tag targeting level 30 and the audio track
2016-07-31 23:22:22 +02:00
const char * const args3 [ ] = { " tageditor " , " set " , " target-level=30 " , " target-tracks=3134325680 " , " title=The audio track " , " encoder=likely some AAC encoder " , " --remove-target " , " target-level=30 " , " --remove-target " , " target-level=50 " , " -f " , mkvFile . data ( ) , nullptr } ;
2016-07-30 23:17:49 +02:00
CPPUNIT_ASSERT_EQUAL ( 0 , execApp ( args3 , stdout , stderr ) ) ;
CPPUNIT_ASSERT_EQUAL ( 0 , execApp ( args1 , stdout , stderr ) ) ;
CPPUNIT_ASSERT ( ( songPos = stdout . find ( " song " ) ) ! = string : : npos ) ;
CPPUNIT_ASSERT ( stdout . find ( " song " , songPos + 1 ) = = string : : npos ) ;
CPPUNIT_ASSERT ( stdout . find ( " 3134325680 " ) ! = string : : npos ) ;
CPPUNIT_ASSERT ( ( albumPos = stdout . find ( " album " ) ) = = string : : npos ) ;
CPPUNIT_ASSERT ( stdout . find ( " Title The audio track " ) ! = string : : npos ) ;
CPPUNIT_ASSERT ( stdout . find ( " Encoder likely some AAC encoder " ) ! = string : : npos ) ;
}
/*!
2016-07-31 23:22:22 +02:00
* \ brief Tests handling of ID3v1 and ID3v2 tags and MP3 specific options .
2016-07-30 23:17:49 +02:00
*/
void CliTests : : testHandlingOfId3Tags ( )
{
// TODO
}
/*!
* \ brief Tests reading and writing multiple files at once .
*/
void CliTests : : testMultipleFiles ( )
{
string stdout , stderr ;
2016-07-31 23:22:22 +02:00
const string mkvFile1 ( workingCopyPath ( " matroska_wave1/test1.mkv " ) ) ;
const string mkvFile2 ( workingCopyPath ( " matroska_wave1/test2.mkv " ) ) ;
const string mkvFile3 ( workingCopyPath ( " matroska_wave1/test3.mkv " ) ) ;
2016-07-30 23:17:49 +02:00
// get tags of 3 files at once
const char * const args1 [ ] = { " tageditor " , " get " , " -f " , mkvFile1 . data ( ) , mkvFile2 . data ( ) , mkvFile3 . data ( ) , nullptr } ;
CPPUNIT_ASSERT_EQUAL ( 0 , execApp ( args1 , stdout , stderr ) ) ;
size_t pos1 = stdout . find ( " Title Big Buck Bunny - test 1 " ) ;
size_t pos2 = stdout . find ( " Title Elephant Dream - test 2 " ) ;
size_t pos3 = stdout . find ( " Title Elephant Dream - test 3 " ) ;
CPPUNIT_ASSERT ( pos1 ! = string : : npos ) ;
CPPUNIT_ASSERT ( pos2 > pos1 ) ;
CPPUNIT_ASSERT ( pos3 > pos2 ) ;
// set title and part number of 3 files at once
const char * const args2 [ ] = { " tageditor " , " set " , " target-level=30 " , " title=test1 " , " title=test2 " , " title=test3 " , " part+=1 " , " target-level=50 " , " title=MKV testfiles " , " totalparts=3 " , " -f " , mkvFile1 . data ( ) , mkvFile2 . data ( ) , mkvFile3 . data ( ) , nullptr } ;
CPPUNIT_ASSERT_EQUAL ( 0 , execApp ( args2 , stdout , stderr ) ) ;
CPPUNIT_ASSERT_EQUAL ( 0 , execApp ( args1 , stdout , stderr ) ) ;
CPPUNIT_ASSERT ( ( pos1 = stdout . find ( " Matroska tag targeting \" level 50 'album, opera, concert, movie, episode' \" \n "
" Title MKV testfiles \n "
" Year 2010 \n "
" Comment Matroska Validation File1, basic MPEG4.2 and MP3 with only SimpleBlock \n "
" Total parts 3 \n "
" Matroska tag targeting \" level 30 'track, song, chapter' \" \n "
" Title test1 \n "
" Part 1 " ) ) ! = string : : npos ) ;
CPPUNIT_ASSERT ( ( pos2 = stdout . find ( " Matroska tag targeting \" level 50 'album, opera, concert, movie, episode' \" \n "
" Title MKV testfiles \n "
" Year 2010 \n "
" Comment Matroska Validation File 2, 100,000 timecode scale, odd aspect ratio, and CRC-32. Codecs are AVC and AAC \n "
" Total parts 3 \n "
" Matroska tag targeting \" level 30 'track, song, chapter' \" \n "
" Title test2 \n "
" Part 2 " ) ) > pos1 ) ;
CPPUNIT_ASSERT ( ( stdout . find ( " Matroska tag targeting \" level 50 'album, opera, concert, movie, episode' \" \n "
" Title MKV testfiles \n "
" Year 2010 \n "
" Comment Matroska Validation File 3, header stripping on the video track and no SimpleBlock \n "
" Total parts 3 \n "
" Matroska tag targeting \" level 30 'track, song, chapter' \" \n "
" Title test3 \n "
" Part 3 " ) ) > pos2 ) ;
}
/*!
* \ brief Tests tagging multiple values per field .
*/
void CliTests : : testMultipleValuesPerField ( )
{
2016-07-31 23:22:22 +02:00
// TODO (feature not implemented yet)
2016-07-30 23:17:49 +02:00
}
/*!
* \ brief Tests handling attachments .
*/
void CliTests : : testHandlingAttachments ( )
2016-07-31 23:22:22 +02:00
{
string stdout , stderr ;
const string mkvFile1 ( workingCopyPath ( " matroska_wave1/test1.mkv " ) ) ;
const string mkvFile2 ( " path= " + testFilePath ( " matroska_wave1/test2.mkv " ) ) ;
// add attachment
const char * const args2 [ ] = { " tageditor " , " set " , " --add-attachment " , " name=test2.mkv " , " mime=video/x-matroska " , " desc=Test attachment " , mkvFile2 . data ( ) , " -f " , mkvFile1 . data ( ) , nullptr } ;
CPPUNIT_ASSERT_EQUAL ( 0 , execApp ( args2 , stdout , stderr ) ) ;
const char * const args1 [ ] = { " tageditor " , " info " , " -f " , mkvFile1 . data ( ) , nullptr } ;
CPPUNIT_ASSERT_EQUAL ( 0 , execApp ( args1 , stdout , stderr ) ) ;
size_t pos1 ;
CPPUNIT_ASSERT ( ( pos1 = stdout . find ( " Attachments: " ) ) ! = string : : npos ) ;
CPPUNIT_ASSERT ( stdout . find ( " Name test2.mkv " ) > pos1 ) ;
CPPUNIT_ASSERT ( stdout . find ( " MIME-type video/x-matroska " ) > pos1 ) ;
CPPUNIT_ASSERT ( stdout . find ( " Description Test attachment " ) > pos1 ) ;
CPPUNIT_ASSERT ( stdout . find ( " Size 20.16 MiB (21142764 byte) " ) > pos1 ) ;
// update attachment
const char * const args3 [ ] = { " tageditor " , " set " , " --update-attachment " , " name=test2.mkv " , " desc=Updated test attachment " , " -f " , mkvFile1 . data ( ) , nullptr } ;
CPPUNIT_ASSERT_EQUAL ( 0 , execApp ( args3 , stdout , stderr ) ) ;
CPPUNIT_ASSERT_EQUAL ( 0 , execApp ( args1 , stdout , stderr ) ) ;
CPPUNIT_ASSERT ( ( pos1 = stdout . find ( " Attachments: " ) ) ! = string : : npos ) ;
CPPUNIT_ASSERT ( stdout . find ( " Name test2.mkv " ) > pos1 ) ;
CPPUNIT_ASSERT ( stdout . find ( " MIME-type video/x-matroska " ) > pos1 ) ;
CPPUNIT_ASSERT ( stdout . find ( " Description Updated test attachment " ) > pos1 ) ;
CPPUNIT_ASSERT ( stdout . find ( " Size 20.16 MiB (21142764 byte) " ) > pos1 ) ;
// TODO: extract assigned attachment (feature not implemented yet)
// remove assigned attachment
const char * const args5 [ ] = { " tageditor " , " set " , " --remove-attachment " , " name=test2.mkv " , " -f " , mkvFile1 . data ( ) , nullptr } ;
CPPUNIT_ASSERT_EQUAL ( 0 , execApp ( args5 , stdout , stderr ) ) ;
CPPUNIT_ASSERT_EQUAL ( 0 , execApp ( args1 , stdout , stderr ) ) ;
CPPUNIT_ASSERT ( stdout . find ( " Attachments: " ) = = string : : npos ) ;
CPPUNIT_ASSERT ( stdout . find ( " Name test2.mkv " ) = = string : : npos ) ;
}
/*!
* \ brief Tests displaying general file info .
*/
void CliTests : : testDisplayingInfo ( )
{
// TODO (not very important)
}
/*!
* \ brief Tests extraction ( used for cover or other binary fields ) .
*/
void CliTests : : testExtraction ( )
2016-07-30 23:17:49 +02:00
{
// TODO
}
/*!
2016-07-31 23:22:22 +02:00
* \ brief Tests reading and writing the document title .
2016-07-30 23:17:49 +02:00
*/
2016-07-31 23:22:22 +02:00
void CliTests : : testReadingAndWritingDocumentTitle ( )
2016-07-30 23:17:49 +02:00
{
// TODO
}
# endif