Various fixes to make tests pass again.
authorCarl Hetherington <cth@carlh.net>
Tue, 5 Nov 2013 15:58:50 +0000 (15:58 +0000)
committerCarl Hetherington <cth@carlh.net>
Tue, 5 Nov 2013 15:58:50 +0000 (15:58 +0000)
src/lib/playlist.cc
src/lib/util.cc
test/film_metadata_test.cc
test/test.cc
test/test.h
test/wscript

index 621b99dd742ed6aa914beabb8f60d6042c622ebf..c54b24c1c947e3bc78c134c74fc36f0e30468ee5 100644 (file)
@@ -82,14 +82,14 @@ Playlist::maybe_sequence_video ()
        _sequencing_video = true;
        
        ContentList cl = _content;
-       Time last = 0;
+       Time next = 0;
        for (ContentList::iterator i = _content.begin(); i != _content.end(); ++i) {
                if (!dynamic_pointer_cast<VideoContent> (*i)) {
                        continue;
                }
                
-               (*i)->set_position (last);
-               last = (*i)->end ();
+               (*i)->set_position (next);
+               next = (*i)->end() + 1;
        }
 
        /* This won't change order, so it does not need a sort */
@@ -260,7 +260,7 @@ Playlist::length () const
 {
        Time len = 0;
        for (ContentList::const_iterator i = _content.begin(); i != _content.end(); ++i) {
-               len = max (len, (*i)->end ());
+               len = max (len, (*i)->end() + 1);
        }
 
        return len;
index 15efcc099555637ca58b8775305c7f14de83fabc..96b834fcc88fe70d3f1be8429b25920a8322318f 100644 (file)
@@ -763,12 +763,17 @@ FrameRateConversion::FrameRateConversion (float source, int dcp)
        , repeat (1)
        , change_speed (false)
 {
-       if (source > (dcp * 2)) {
+       if (fabs (source / 2.0 - dcp) < fabs (source - dcp)) {
+               /* The difference between source and DCP frame rate will be lower
+                  (i.e. better) if we skip.
+               */
                skip = true;
-       }
-
-       if (source < dcp) {
-               repeat = floor (dcp / source);
+       } else if (fabs (source * 2 - dcp) < fabs (source - dcp)) {
+               /* The difference between source and DCP frame rate would be better
+                  if we repeated each frame once; it may be better still if we
+                  repeated more than once.  Work out the required repeat.
+               */
+               repeat = round (dcp / source);
        }
 
        change_speed = !about_equal (source * factor(), dcp);
index 324787f194070e7d622d7915b8449014e2716945..1f06aa538568b6a83f57f75d36410eea47a69c3e 100644 (file)
 #include "lib/film.h"
 #include "lib/dcp_content_type.h"
 #include "lib/ratio.h"
+#include "test.h"
 
 using std::string;
 using std::stringstream;
+using std::list;
 using boost::shared_ptr;
 
 BOOST_AUTO_TEST_CASE (film_metadata_test)
@@ -48,9 +50,9 @@ BOOST_AUTO_TEST_CASE (film_metadata_test)
        f->set_j2k_bandwidth (200000000);
        f->write_metadata ();
 
-       stringstream s;
-       s << "diff -u test/data/metadata.xml.ref " << test_film << "/metadata.xml";
-       BOOST_CHECK_EQUAL (::system (s.str().c_str ()), 0);
+       list<string> ignore;
+       ignore.push_back ("Key");
+       check_xml ("test/data/metadata.xml.ref", test_film + "/metadata.xml", ignore);
 
        shared_ptr<Film> g (new Film (test_film));
        g->read_metadata ();
@@ -60,5 +62,5 @@ BOOST_AUTO_TEST_CASE (film_metadata_test)
        BOOST_CHECK_EQUAL (g->container(), Ratio::from_id ("185"));
        
        g->write_metadata ();
-       BOOST_CHECK_EQUAL (::system (s.str().c_str ()), 0);
+       check_xml ("test/data/metadata.xml.ref", test_film + "/metadata.xml", ignore);
 }
index 154510738e3200bd4ebc1b15cb52ce58763a42b0..1309439d21594e4a66d3f11bf024a9d89798cf6e 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <vector>
 #include <list>
+#include <libxml++/libxml++.h>
 #include <libdcp/dcp.h>
 #include "lib/config.h"
 #include "lib/util.h"
@@ -147,6 +148,64 @@ check_dcp (string ref, string check)
        BOOST_CHECK (ref_dcp.equals (check_dcp, options, boost::bind (note, _1, _2)));
 }
 
+void
+check_xml (xmlpp::Element* ref, xmlpp::Element* test, list<string> ignore)
+{
+       BOOST_CHECK_EQUAL (ref->get_name (), test->get_name ());
+       BOOST_CHECK_EQUAL (ref->get_namespace_prefix (), test->get_namespace_prefix ());
+
+       if (find (ignore.begin(), ignore.end(), ref->get_name()) != ignore.end ()) {
+               return;
+       }
+           
+       xmlpp::Element::NodeList ref_children = ref->get_children ();
+       xmlpp::Element::NodeList test_children = test->get_children ();
+       BOOST_CHECK_EQUAL (ref_children.size (), test_children.size ());
+
+       xmlpp::Element::NodeList::iterator k = ref_children.begin ();
+       xmlpp::Element::NodeList::iterator l = test_children.begin ();
+       while (k != ref_children.end ()) {
+               
+               /* XXX: should be doing xmlpp::EntityReference, xmlpp::XIncludeEnd, xmlpp::XIncludeStart */
+
+               xmlpp::Element* ref_el = dynamic_cast<xmlpp::Element*> (*k);
+               xmlpp::Element* test_el = dynamic_cast<xmlpp::Element*> (*l);
+               BOOST_CHECK ((ref_el && test_el) || (!ref_el && !test_el));
+               if (ref_el && test_el) {
+                       check_xml (ref_el, test_el, ignore);
+               }
+
+               xmlpp::ContentNode* ref_cn = dynamic_cast<xmlpp::ContentNode*> (*k);
+               xmlpp::ContentNode* test_cn = dynamic_cast<xmlpp::ContentNode*> (*l);
+               BOOST_CHECK ((ref_cn && test_cn) || (!ref_cn && !test_cn));
+               if (ref_cn && test_cn) {
+                       BOOST_CHECK_EQUAL (ref_cn->get_content(), test_cn->get_content ());
+               }
+
+               xmlpp::Attribute* ref_at = dynamic_cast<xmlpp::Attribute*> (*k);
+               xmlpp::Attribute* test_at = dynamic_cast<xmlpp::Attribute*> (*l);
+               BOOST_CHECK ((ref_at && test_at) || (!ref_at && !test_at));
+               if (ref_at && test_at) {
+                       BOOST_CHECK_EQUAL (ref_at->get_name(), test_at->get_name ());
+                       BOOST_CHECK_EQUAL (ref_at->get_value(), test_at->get_value ());
+               }
+
+               ++k;
+               ++l;
+       }
+}
+
+void
+check_xml (boost::filesystem::path ref, boost::filesystem::path test, list<string> ignore)
+{
+       xmlpp::DomParser* ref_parser = new xmlpp::DomParser (ref.string ());
+       xmlpp::Element* ref_root = ref_parser->get_document()->get_root_node ();
+       xmlpp::DomParser* test_parser = new xmlpp::DomParser (test.string ());
+       xmlpp::Element* test_root = test_parser->get_document()->get_root_node ();
+
+       check_xml (ref_root, test_root, ignore);
+}
+
 void
 wait_for_jobs ()
 {
index 5c37f82d8e2987583b3944247bfb1bd9bb7b3060..e49dfc276fb58db43109bf27cb360354e28b734a 100644 (file)
@@ -24,4 +24,5 @@ class Film;
 extern void wait_for_jobs ();
 extern boost::shared_ptr<Film> new_test_film (std::string);
 extern void check_dcp (std::string, std::string);
+extern void check_xml (boost::filesystem::path, boost::filesystem::path, std::list<std::string>);
 extern boost::filesystem::path test_film_dir (std::string);
index 7c7aee733bd51488f791a57887ea25fa7dcf3260..b40b6947521e913637f828428cc057148a4a8d17 100644 (file)
@@ -16,6 +16,9 @@ def build(bld):
     obj.use    = 'libdcpomatic'
     obj.source = """
                  test.cc
+                 scaling_test.cc
+                 film_metadata_test.cc
+                 frame_rate_test.cc
                  colour_conversion_test.cc
                  audio_delay_test.cc
                  silence_padding_test.cc
@@ -24,15 +27,12 @@ def build(bld):
                  ffmpeg_audio_test.cc
                  threed_test.cc
                  play_test.cc
-                 frame_rate_test.cc
                  ffmpeg_pts_offset.cc
                  ffmpeg_examiner_test.cc
                  black_fill_test.cc
-                 scaling_test.cc
                  ratio_test.cc
                  pixel_formats_test.cc
                  make_black_test.cc
-                 film_metadata_test.cc
                  stream_test.cc
                  util_test.cc
                  ffmpeg_dcp_test.cc