root/testsuite/libbase.all/snappingrangetest.cpp

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. main

// 
//   Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Free Software
//   Foundation, Inc
// 
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

#ifdef HAVE_CONFIG_H
#include "gnashconfig.h"
#endif

#include "check.h"
#include "Range2d.h"
#include "snappingrange.h"
#include <iostream>
#include <sstream>
#include <cassert>

using namespace std;
using namespace gnash;
using namespace gnash::geometry;

int
main(int /*argc*/, char** /*argv*/)
{

        //
        // Test NULL range construction
        //

        SnappingRanges2d<float> nullSnap1;
        check(   nullSnap1.isNull() );
        check( ! nullSnap1.isWorld() );

        //
        // Test WORLD range construction
        //

        Range2d<float> worldRange1(worldRange);
        SnappingRanges2d<float> worldSnap1;
        worldSnap1.add(worldRange);
        check( ! worldSnap1.isNull() );
        check(   worldSnap1.isWorld() );
        
        
        //
        // Test world range no-op additions
        //

        Range2d<float> someRange(10.1,20.2,30.3,40.4);
        worldSnap1.add(someRange);
        check( ! worldSnap1.isNull() );
        check(   worldSnap1.isWorld() );
        
        //
        // Test overlapping ranges snapping
        //
        
        Range2d<float> upperleft (10, 10, 30, 30); 
        Range2d<float> lowerright (20, 20, 40, 40);
        SnappingRanges2d<float> overlapSnap;
        overlapSnap.add(upperleft);
        overlapSnap.add(lowerright);
        check( ! overlapSnap.isNull() );
        check( ! overlapSnap.isWorld() );
        check( ! overlapSnap.contains(5,  5) );
        check(   overlapSnap.contains(10, 10) );
        check(   overlapSnap.contains(15, 15) );
        check(   overlapSnap.contains(20, 20) );
        check(   overlapSnap.contains(25, 25) );
        check(   overlapSnap.contains(30, 30) );
        check(   overlapSnap.contains(35, 35) );
        check(   overlapSnap.contains(40, 40) );
        check( ! overlapSnap.contains(45, 45) );
        
        // 
        // Test touching ranges snapping
        //
        
        Range2d<float> left1 (10, 10, 50, 50); 
        Range2d<float> right1 (50, 10, 100, 50);
        SnappingRanges2d<float> touchSnap;
        touchSnap.setSnapFactor(1.3f);
        touchSnap.add(left1);
        touchSnap.add(right1);
        check( ! touchSnap.isNull() );
        check( ! touchSnap.isWorld() );
        check( ! touchSnap.contains( 5, 30) );
        check(   touchSnap.contains(10, 30) );
        check(   touchSnap.contains(15, 30) );
        check(   touchSnap.contains(45, 30) );
        check(   touchSnap.contains(50, 30) );
        check(   touchSnap.contains(55, 30) );
        check(   touchSnap.contains(95, 30) );
        check(   touchSnap.contains(100, 30) );
        check( ! touchSnap.contains(105, 30) );

        // 
        // Test near ranges snapping
        //
        
        Range2d<float> left2 (10, 10, 50, 50); 
        Range2d<float> right2 (60, 10, 100, 50);
        SnappingRanges2d<float> nearSnap;
        touchSnap.setSnapFactor(1.3f);
        nearSnap.add(left2);
        nearSnap.add(right2);
        check( ! nearSnap.isNull() );
        check( ! nearSnap.isWorld() );
        check( ! nearSnap.contains( 5, 30) );
        check(   nearSnap.contains(10, 30) );
        check(   nearSnap.contains(15, 30) );
        check(   nearSnap.contains(45, 30) );
        check(   nearSnap.contains(50, 30) );
        check(   nearSnap.contains(55, 30) );
        check(   nearSnap.contains(95, 30) );
        check(   nearSnap.contains(100, 30) );
        check( ! nearSnap.contains(105, 30) );
        
        
        //
        // Test irregular ranges (should not snap)
        //

        Range2d<float> horiz (10, 10, 500, 20); 
        Range2d<float> vert (290, 22, 300, 500);
        SnappingRanges2d<float> irrSnap;
        touchSnap.setSnapFactor(1.3f);
        irrSnap.add(horiz);
        irrSnap.add(vert);
        check( ! irrSnap.isNull() );
        check( ! irrSnap.isWorld() );
        check(   irrSnap.contains( 15,  15) );
        check(   irrSnap.contains(495,  15) );
        check(   irrSnap.contains(295,  10) );
        check(   irrSnap.contains(295,  15) );
        check(   irrSnap.contains(295,  20) );
        check(   irrSnap.contains(295,  22) );
        check(   irrSnap.contains(295,  25) );
        check(   irrSnap.contains(295,  30) );
        check(   irrSnap.contains(295, 495) );
        check( ! irrSnap.contains( 15,  25) );
        check( ! irrSnap.contains(495,  25) );
        check( ! irrSnap.contains( 15, 495) );
        check( ! irrSnap.contains(495, 495) );

        check( irrSnap.contains(horiz) );
        check( irrSnap.contains(vert) );

        SnappingRanges2d<int> irrIntSnap(irrSnap);
        check( irrSnap.contains(Range2d<int>(horiz)) );
        check( irrSnap.contains(Range2d<int>(vert)) );
        
         
        //
        // Test ranges containment
        //

        Range2d<float> nullRange1;
        SnappingRanges2d<float> nullSnap2;
        SnappingRanges2d<float> nullSnap3;

        check( ! nullSnap2.contains(nullRange1) );
        check( ! nullSnap2.contains(nullSnap3) );
        // null rangeset don't contain themselves
        check( ! nullSnap2.contains(nullSnap2) );

        Range2d<float> worldRange2(worldRange);
        SnappingRanges2d<float> worldSnap2; worldSnap2.setWorld();

        check( ! nullSnap2.contains(worldRange2) );
        check( ! nullSnap2.contains(worldSnap2) );
        check( worldSnap2.contains(worldRange2) );
        check( worldSnap2.contains(worldSnap2) );
        check( ! worldSnap2.contains(nullRange1) );
        check( ! worldSnap2.contains(nullSnap2) );

        // TODO: test with finite ranges

        SnappingRanges2d<float> finSnap1;
        SnappingRanges2d<float> finSnap2;

        check(!finSnap2.contains(finSnap1));
        check(!finSnap1.contains(finSnap2));

        finSnap1.add(Range2d<float>(0, 0, 10, 10));

        check(!finSnap2.contains(finSnap1));
        check(!finSnap1.contains(finSnap2));

        finSnap2.add(Range2d<float>(90, 90, 180, 180));

        check(!finSnap2.contains(finSnap1));
        check(!finSnap1.contains(finSnap2));

        finSnap1.add(Range2d<float>(30, 30, 80, 80));

        check(!finSnap2.contains(finSnap1));
        check(!finSnap1.contains(finSnap2));

        finSnap2.add(Range2d<float>(2, 2, 8, 8));

        check(!finSnap2.contains(finSnap1));
        check(!finSnap1.contains(finSnap2));

        finSnap1.add(Range2d<float>(85, 85, 185, 185));

        check(!finSnap2.contains(finSnap1));
        check(finSnap1.contains(finSnap2));

        SnappingRanges2d<int> finSnap3;
        finSnap3.add(Range2d<int>(38,268, 112,292));
        SnappingRanges2d<int> finSnap4;
        finSnap4.add(Range2d<int>(40,273, 108,287));

        check(finSnap3.contains(finSnap4));
}


/* [<][>][^][v][top][bottom][index][help] */