Blame IlmImfTest/testMultiView.cpp

Packit 0d464f
///////////////////////////////////////////////////////////////////////////
Packit 0d464f
//
Packit 0d464f
// Copyright (c) 2007 Weta Digital Ltd
Packit 0d464f
// Copyright (c) 2012 Industrial Light & Magic, a division of Lucasfilm
Packit 0d464f
// 
Packit 0d464f
// All rights reserved.
Packit 0d464f
// 
Packit 0d464f
// Redistribution and use in source and binary forms, with or without
Packit 0d464f
// modification, are permitted provided that the following conditions are
Packit 0d464f
// met:
Packit 0d464f
// *       Redistributions of source code must retain the above copyright
Packit 0d464f
// notice, this list of conditions and the following disclaimer.
Packit 0d464f
// *       Redistributions in binary form must reproduce the above
Packit 0d464f
// copyright notice, this list of conditions and the following disclaimer
Packit 0d464f
// in the documentation and/or other materials provided with the
Packit 0d464f
// distribution.
Packit 0d464f
// *       Neither the name of Weta Digital nor the names of
Packit 0d464f
// its contributors may be used to endorse or promote products derived
Packit 0d464f
// from this software without specific prior written permission. 
Packit 0d464f
// 
Packit 0d464f
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit 0d464f
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit 0d464f
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit 0d464f
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit 0d464f
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit 0d464f
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit 0d464f
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit 0d464f
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit 0d464f
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit 0d464f
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit 0d464f
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit 0d464f
//
Packit 0d464f
///////////////////////////////////////////////////////////////////////////
Packit 0d464f
Packit 0d464f
Packit 0d464f
Packit 0d464f
#include <ImfMultiView.h>
Packit 0d464f
Packit 0d464f
#include <typeinfo>
Packit 0d464f
#include <sstream>
Packit 0d464f
#include <string.h>
Packit 0d464f
#include <assert.h>
Packit 0d464f
#include <stdarg.h>
Packit 0d464f
Packit 0d464f
Packit 0d464f
using namespace OPENEXR_IMF_NAMESPACE;
Packit 0d464f
using namespace std;
Packit 0d464f
Packit 0d464f
Packit 0d464f
namespace {
Packit 0d464f
Packit 0d464f
ChannelList
Packit 0d464f
buildList (const char *name, ...)
Packit 0d464f
{
Packit 0d464f
    //
Packit 0d464f
    // nice function to build channel lists
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    ChannelList list;
Packit 0d464f
    const char *channelName = name;
Packit 0d464f
Packit 0d464f
    va_list ap;
Packit 0d464f
    va_start (ap, name);
Packit 0d464f
Packit 0d464f
    while (channelName != 0)
Packit 0d464f
    {
Packit 0d464f
	list.insert (channelName, Channel());
Packit 0d464f
	channelName = va_arg (ap, char *);
Packit 0d464f
    }
Packit 0d464f
Packit 0d464f
    va_end (ap);
Packit 0d464f
    return list;
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
testMultiViewFunctions ()
Packit 0d464f
{
Packit 0d464f
    StringVector multiView;
Packit 0d464f
Packit 0d464f
    multiView.push_back ("right");
Packit 0d464f
    multiView.push_back ("left");
Packit 0d464f
    multiView.push_back ("centre");
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // Test viewFromChannelName()
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    // default view
Packit 0d464f
Packit 0d464f
    assert (viewFromChannelName ("R", multiView) == "right");
Packit 0d464f
Packit 0d464f
    // explicitly specified default view
Packit 0d464f
Packit 0d464f
    assert (viewFromChannelName ("right.balween", multiView) == "right");
Packit 0d464f
Packit 0d464f
    // non-default view: two sections
Packit 0d464f
Packit 0d464f
    assert (viewFromChannelName ("left.gritstone", multiView) == "left");
Packit 0d464f
Packit 0d464f
    // non-default view: two sections
Packit 0d464f
Packit 0d464f
    assert (viewFromChannelName ("centre.ronaldsay", multiView) == "centre");
Packit 0d464f
Packit 0d464f
    // non-default view: three sections
Packit 0d464f
Packit 0d464f
    assert (viewFromChannelName ("swaledale.left.lonk", multiView) == "left");
Packit 0d464f
Packit 0d464f
    // explicitly specified default view: four sections
Packit 0d464f
Packit 0d464f
    assert (viewFromChannelName ("manx.loghtan.right.shetland",
Packit 0d464f
				 multiView) == "right");
Packit 0d464f
Packit 0d464f
    // non-default view: five sections
Packit 0d464f
Packit 0d464f
    assert (viewFromChannelName ("dorset.down.hebridean.centre.r",
Packit 0d464f
                                 multiView) == "centre");
Packit 0d464f
Packit 0d464f
    // shouldn't happen that we have null channel names
Packit 0d464f
Packit 0d464f
    assert (viewFromChannelName ("", multiView) == "");
Packit 0d464f
Packit 0d464f
    // single section with no view name: default view
Packit 0d464f
Packit 0d464f
    assert (viewFromChannelName ("dartmoor", multiView) == "right");
Packit 0d464f
Packit 0d464f
    // two sections with no view name: no view
Packit 0d464f
Packit 0d464f
    assert (viewFromChannelName ("scottish.blackface", multiView) == "");
Packit 0d464f
Packit 0d464f
    // three sections with no view name: no view
Packit 0d464f
Packit 0d464f
    assert (viewFromChannelName ("beulah.speckled.face", multiView) == "");
Packit 0d464f
Packit 0d464f
    // four sections with no view name: no view
Packit 0d464f
Packit 0d464f
    assert (viewFromChannelName ("devon.and.cornwall.longwool",
Packit 0d464f
				 multiView) == "");
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // Test areCounterparts()
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    // two non default channel names in list
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("right.R",
Packit 0d464f
			     "centre.R",
Packit 0d464f
			     multiView) == true);
Packit 0d464f
Packit 0d464f
    // two channel names, both explicit and in list,
Packit 0d464f
    // even though one is default channel
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("left.R",
Packit 0d464f
			     "right.R",
Packit 0d464f
			     multiView) == true);
Packit 0d464f
Packit 0d464f
    // default view with non-default view
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("R",
Packit 0d464f
			     "left.R",
Packit 0d464f
			     multiView) == true);
Packit 0d464f
Packit 0d464f
    // as above, but other way round
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("left.R",
Packit 0d464f
			     "R",
Packit 0d464f
			     multiView) == true);
Packit 0d464f
Packit 0d464f
    // same channel name specified in two different ways
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("right.R",
Packit 0d464f
			     "R",
Packit 0d464f
			     multiView) == false);
Packit 0d464f
Packit 0d464f
    // as above, but other way round
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("R",
Packit 0d464f
			     "right.R",
Packit 0d464f
			     multiView) == false);
Packit 0d464f
Packit 0d464f
    // none.R is not in a view
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("none.R",
Packit 0d464f
			     "left.R",
Packit 0d464f
			     multiView) == false);
Packit 0d464f
Packit 0d464f
    // as above, but other way round
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("left.R",
Packit 0d464f
			     "none.R",
Packit 0d464f
			     multiView) == false);
Packit 0d464f
Packit 0d464f
    // as above, but with default channel
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("X",
Packit 0d464f
			     "none.X",
Packit 0d464f
			     multiView) == false);
Packit 0d464f
Packit 0d464f
    // as above, but other way round
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("none.B",
Packit 0d464f
			     "B",
Packit 0d464f
			     multiView) == false);
Packit 0d464f
Packit 0d464f
    // both not in a view
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("southdown.none.G",
Packit 0d464f
			     "wiltshire.horn.G",
Packit 0d464f
			     multiView) == false);
Packit 0d464f
Packit 0d464f
    // as above, but different lengths of names
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("wiltshire.horn.G",
Packit 0d464f
			     "cotswold.G",
Packit 0d464f
			     multiView) == false);
Packit 0d464f
Packit 0d464f
    // three section pairs
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("wensleydale.left.baa",
Packit 0d464f
                             "wensleydale.right.baa",
Packit 0d464f
			     multiView) == true);
Packit 0d464f
Packit 0d464f
    // different in first section
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("wensleydal.left.baa",
Packit 0d464f
                             "wensleydale.right.baa",
Packit 0d464f
			     multiView) == false);
Packit 0d464f
Packit 0d464f
    // different in last section
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("wensleydale.left.bah",
Packit 0d464f
                             "wensleydale.right.baa",
Packit 0d464f
			     multiView) == false);
Packit 0d464f
Packit 0d464f
    // same channel
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("wensleydale.left.baa",
Packit 0d464f
                             "wensleydale.left.baa",
Packit 0d464f
			     multiView) == false);
Packit 0d464f
Packit 0d464f
    // second is in no view
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("wensleydale.right.fell",
Packit 0d464f
			     "wensleydale.rough.fell",
Packit 0d464f
			     multiView) == false);
Packit 0d464f
Packit 0d464f
    // first is in no view
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("wensleydale.rough.fell",
Packit 0d464f
			     "wensleydale.left.fell",
Packit 0d464f
			     multiView) == false);
Packit 0d464f
Packit 0d464f
    // four sectons
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("lincoln.longwool.right.A",
Packit 0d464f
			     "lincoln.longwool.left.A",
Packit 0d464f
			     multiView) == true);
Packit 0d464f
Packit 0d464f
    // different in final section
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("lincoln.longwool.right.B",
Packit 0d464f
			     "lincoln.longwool.left.A",
Packit 0d464f
			     multiView) == false);
Packit 0d464f
Packit 0d464f
    // different in second section
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("lincoln.shortwool.right.A",
Packit 0d464f
			     "lincoln.longwool.left.A",
Packit 0d464f
			     multiView) == false);
Packit 0d464f
Packit 0d464f
    // different in first section
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("cumbria.longwool.right.A",
Packit 0d464f
			     "lincoln.longwool.left.A",
Packit 0d464f
			     multiView) == false);
Packit 0d464f
Packit 0d464f
    // enough said
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("baa.baa.black.sheep",
Packit 0d464f
			     "lincoln.longwool.left.A",
Packit 0d464f
			     multiView) == false);
Packit 0d464f
Packit 0d464f
Packit 0d464f
    // three sections with default - only last is same
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("portland.left.baa",
Packit 0d464f
			     "baa",
Packit 0d464f
			     multiView) == false);
Packit 0d464f
Packit 0d464f
    // four sections with default
Packit 0d464f
Packit 0d464f
    assert (areCounterparts ("dorset.down.left.baa",
Packit 0d464f
			     "baa",
Packit 0d464f
			     multiView) == false);
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // Channel list tests
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    // list of channels in some multiview image
Packit 0d464f
Packit 0d464f
    ChannelList a = buildList
Packit 0d464f
	("A",
Packit 0d464f
	 "B",
Packit 0d464f
	 "C",
Packit 0d464f
	 "right.jacob",
Packit 0d464f
	 "shropshire.right.D",
Packit 0d464f
	 "castlemilk.moorit.right.A",
Packit 0d464f
	 "black.welsh.mountain.right.A",
Packit 0d464f
	 "left.A",
Packit 0d464f
	 "left.B",
Packit 0d464f
	 "left.C",
Packit 0d464f
	 "left.jacob",
Packit 0d464f
	 "shropshire.left.D",
Packit 0d464f
	 "castlemilk.moorit.left.A",
Packit 0d464f
	 "black.welsh.mountain.left.A",
Packit 0d464f
	 "centre.A",
Packit 0d464f
	 "centre.B",
Packit 0d464f
	 "centre.C",
Packit 0d464f
	 "shropshire.centre.D",
Packit 0d464f
	 "castlemilk.moorit.centre.A",
Packit 0d464f
	 "none.A",
Packit 0d464f
	 "none.B",
Packit 0d464f
	 "none.C",
Packit 0d464f
	 "none.D",
Packit 0d464f
	 "none.jacob",
Packit 0d464f
	 "shropshire.none.D",
Packit 0d464f
	 "rough.fell",
Packit 0d464f
	 (char *) 0);
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // List of channels in each view
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    // all left channels
Packit 0d464f
Packit 0d464f
    ChannelList realLeft = buildList
Packit 0d464f
	("left.A",
Packit 0d464f
	 "left.B",
Packit 0d464f
	 "left.C",
Packit 0d464f
	 "left.jacob",
Packit 0d464f
	 "shropshire.left.D",
Packit 0d464f
	 "castlemilk.moorit.left.A",
Packit 0d464f
	 "black.welsh.mountain.left.A",
Packit 0d464f
	 (char *) 0);
Packit 0d464f
Packit 0d464f
    ChannelList realRight = buildList
Packit 0d464f
	("A",
Packit 0d464f
	 "B",
Packit 0d464f
	 "C",
Packit 0d464f
	 "right.jacob",
Packit 0d464f
	 "shropshire.right.D",
Packit 0d464f
	 "castlemilk.moorit.right.A",
Packit 0d464f
	 "black.welsh.mountain.right.A",
Packit 0d464f
	 (char *) 0);
Packit 0d464f
Packit 0d464f
    // all the right channels including the default channels
Packit 0d464f
Packit 0d464f
    ChannelList realCentre = buildList
Packit 0d464f
	("centre.A",
Packit 0d464f
	 "centre.B",
Packit 0d464f
	 "centre.C",
Packit 0d464f
	 "shropshire.centre.D",
Packit 0d464f
	 "castlemilk.moorit.centre.A",
Packit 0d464f
	 (char *) 0);
Packit 0d464f
Packit 0d464f
    // no jacob channel
Packit 0d464f
    // there IS a jacob channel but it has no counterparts because
Packit 0d464f
    // this is in "no view"
Packit 0d464f
Packit 0d464f
    ChannelList realNone = buildList
Packit 0d464f
	("none.A",
Packit 0d464f
	 "none.B",
Packit 0d464f
	 "none.D",
Packit 0d464f
	 "none.C",
Packit 0d464f
	 "none.jacob",
Packit 0d464f
	 "shropshire.none.D",
Packit 0d464f
	 "rough.fell",
Packit 0d464f
	 (char *) 0);
Packit 0d464f
Packit 0d464f
    // have a dummy name just to throw a wolf amongst the sheep
Packit 0d464f
Packit 0d464f
    multiView.push_back ("wolf");
Packit 0d464f
Packit 0d464f
    // no channels
Packit 0d464f
Packit 0d464f
    ChannelList realNull = buildList ((char *) 0);
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // Test channelsInView()
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    // default view channel extraction
Packit 0d464f
Packit 0d464f
    assert (channelsInView ("right", a, multiView) == realRight);
Packit 0d464f
Packit 0d464f
    // non-default view channel extraction
Packit 0d464f
Packit 0d464f
    assert (channelsInView ("left", a, multiView) == realLeft);
Packit 0d464f
Packit 0d464f
    // missing 'centre.jacob'
Packit 0d464f
Packit 0d464f
    assert (channelsInView ("centre", a, multiView) == realCentre);
Packit 0d464f
Packit 0d464f
    // "none" isn't a view name, no channels returned
Packit 0d464f
Packit 0d464f
    assert (channelsInView ("none", a, multiView) == realNull);
Packit 0d464f
Packit 0d464f
    // "wolf" has no channels, no channels returned
Packit 0d464f
Packit 0d464f
    assert (channelsInView ("wolf", a, multiView) == realNull);
Packit 0d464f
Packit 0d464f
    // all no view channels
Packit 0d464f
Packit 0d464f
    assert (channelsInNoView (a, multiView)  == realNone);
Packit 0d464f
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // Test channelInAllViews()
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    ChannelList realA = buildList
Packit 0d464f
	("left.A",
Packit 0d464f
	 "A",
Packit 0d464f
	 "centre.A",
Packit 0d464f
	 (char *) 0);
Packit 0d464f
Packit 0d464f
    ChannelList realB = buildList
Packit 0d464f
	("left.B",
Packit 0d464f
	 "B",
Packit 0d464f
	 "centre.B",
Packit 0d464f
	 (char *) 0);
Packit 0d464f
Packit 0d464f
    ChannelList realJacob = buildList
Packit 0d464f
	("left.jacob",
Packit 0d464f
	 "right.jacob",
Packit 0d464f
	 (char *) 0);
Packit 0d464f
Packit 0d464f
    ChannelList realCm = buildList
Packit 0d464f
	("castlemilk.moorit.left.A",
Packit 0d464f
	 "castlemillk.moorit.right.A",
Packit 0d464f
	 "castlemilk.moorit.centre.A",
Packit 0d464f
	 (char *) 0);
Packit 0d464f
Packit 0d464f
    ChannelList realBwm = buildList
Packit 0d464f
	("black.welsh.mountain.left.A",
Packit 0d464f
	 "black.welsh.mountain.right.A",
Packit 0d464f
	 (char *) 0);
Packit 0d464f
Packit 0d464f
    assert (channelInAllViews ("left.A", a, multiView) == realA);
Packit 0d464f
Packit 0d464f
    assert (channelInAllViews ("A", a, multiView) == realA);
Packit 0d464f
Packit 0d464f
    assert (channelInAllViews ("centre.B", a, multiView) == realB);
Packit 0d464f
Packit 0d464f
    assert (channelInAllViews ("right.jacob", a, multiView) == realJacob);
Packit 0d464f
Packit 0d464f
    assert (channelInAllViews ("castlemilk.moorit.centre.A",
Packit 0d464f
			       a, multiView) == realCm);
Packit 0d464f
Packit 0d464f
    assert (channelInAllViews ("black.welsh.mountain.right.A",
Packit 0d464f
			       a, multiView) == realBwm);
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // Test insertViewName()
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    assert (insertViewName ("A", multiView, 0) ==
Packit 0d464f
			    "A");
Packit 0d464f
Packit 0d464f
    assert (insertViewName ("mountain.A", multiView, 0) ==
Packit 0d464f
			    "mountain.right.A");
Packit 0d464f
Packit 0d464f
    assert (insertViewName ("welsh.mountain.A", multiView, 0) ==
Packit 0d464f
			    "welsh.mountain.right.A");
Packit 0d464f
Packit 0d464f
    assert (insertViewName ("black.welsh.mountain.A", multiView, 0) ==
Packit 0d464f
			    "black.welsh.mountain.right.A");
Packit 0d464f
Packit 0d464f
    assert (insertViewName ("A", multiView, 1) ==
Packit 0d464f
			    "left.A");
Packit 0d464f
Packit 0d464f
    assert (insertViewName ("mountain.A", multiView, 1) ==
Packit 0d464f
			    "mountain.left.A");
Packit 0d464f
Packit 0d464f
    assert (insertViewName ("welsh.mountain.A", multiView, 1) ==
Packit 0d464f
			    "welsh.mountain.left.A");
Packit 0d464f
Packit 0d464f
    assert (insertViewName ("black.welsh.mountain.A", multiView, 1) ==
Packit 0d464f
			    "black.welsh.mountain.left.A");
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
} // namespace 
Packit 0d464f
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
testMultiView (const std::string&)
Packit 0d464f
{
Packit 0d464f
    try
Packit 0d464f
    {
Packit 0d464f
	cout << "Testing multi-view channel list functions" << endl;
Packit 0d464f
	testMultiViewFunctions();
Packit 0d464f
	cout << "ok\n" << endl;
Packit 0d464f
    }
Packit 0d464f
    catch (const std::exception &e)
Packit 0d464f
    {
Packit 0d464f
	cerr << "ERROR -- caught exception: " << e.what() << endl;
Packit 0d464f
	assert (false);
Packit 0d464f
    }
Packit 0d464f
}