diff -r 000000000000 -r 671dee74050a searchengine/util/tsrc/cpixtoolsunittest/src/geotests.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/searchengine/util/tsrc/cpixtoolsunittest/src/geotests.cpp Mon Apr 19 14:40:16 2010 +0300 @@ -0,0 +1,390 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#include +#include + + +#include "itk.h" + +#include "cpixgeotools.h" +#include "cpixstrtools.h" + + + +struct GeoData { + char gpsLongitudeRef_; + Cpt::ExifGpsCoord gpsLongitude_; + char gpsLatitudeRef_; + Cpt::ExifGpsCoord gpsLatitude_; +}; + +GeoData TestData[] = { + + // Quads around origo. On level 15, they should be about of + // 0.611495 / 0.305238 km size + { + Cpt::QNr::EAST, + Cpt::ExifGpsCoord(Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(1,100)), + Cpt::QNr::NORTH, + Cpt::ExifGpsCoord(Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(1,100)) + }, + { + Cpt::QNr::EAST, + Cpt::ExifGpsCoord(Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(1,100)), + Cpt::QNr::SOUTH, + Cpt::ExifGpsCoord(Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(1,100)) + }, + { + Cpt::QNr::WEST, + Cpt::ExifGpsCoord(Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(1,100)), + Cpt::QNr::NORTH, + Cpt::ExifGpsCoord(Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(1,100)) + }, + { + Cpt::QNr::WEST, + Cpt::ExifGpsCoord(Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(1,100)), + Cpt::QNr::SOUTH, + Cpt::ExifGpsCoord(Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(1,100)) + }, + + // Quads at mid-points of 4 great quads. On level 15, they should + // be about of 0.4324.. / 0.305238 km size + // + { + Cpt::QNr::EAST, + Cpt::ExifGpsCoord(Cpt::ExifRational(90,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1)), + Cpt::QNr::NORTH, + Cpt::ExifGpsCoord(Cpt::ExifRational(45,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1)) + }, + { + Cpt::QNr::EAST, + Cpt::ExifGpsCoord(Cpt::ExifRational(90,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1)), + Cpt::QNr::SOUTH, + Cpt::ExifGpsCoord(Cpt::ExifRational(45,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1)) + }, + { + Cpt::QNr::WEST, + Cpt::ExifGpsCoord(Cpt::ExifRational(90,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1)), + Cpt::QNr::NORTH, + Cpt::ExifGpsCoord(Cpt::ExifRational(45,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1)) + }, + { + Cpt::QNr::WEST, + Cpt::ExifGpsCoord(Cpt::ExifRational(90,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1)), + Cpt::QNr::SOUTH, + Cpt::ExifGpsCoord(Cpt::ExifRational(45,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1)) + }, + + + // Quads at mid-points / 60 degrees of 4 great quads. On level 15, + // they should be about of 0.3057 / 0.305238 km size + // + { + Cpt::QNr::EAST, + Cpt::ExifGpsCoord(Cpt::ExifRational(90,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1)), + Cpt::QNr::NORTH, + Cpt::ExifGpsCoord(Cpt::ExifRational(60,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1)) + }, + { + Cpt::QNr::EAST, + Cpt::ExifGpsCoord(Cpt::ExifRational(90,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1)), + Cpt::QNr::SOUTH, + Cpt::ExifGpsCoord(Cpt::ExifRational(60,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1)) + }, + { + Cpt::QNr::WEST, + Cpt::ExifGpsCoord(Cpt::ExifRational(90,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1)), + Cpt::QNr::NORTH, + Cpt::ExifGpsCoord(Cpt::ExifRational(60,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1)) + }, + { + Cpt::QNr::WEST, + Cpt::ExifGpsCoord(Cpt::ExifRational(90,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1)), + Cpt::QNr::SOUTH, + Cpt::ExifGpsCoord(Cpt::ExifRational(60,1), + Cpt::ExifRational(0,1), + Cpt::ExifRational(0,1)) + }, + + // Quads around the poles. They should have a very short width + // indeed (centimeters). + { + Cpt::QNr::EAST, + Cpt::ExifGpsCoord(Cpt::ExifRational(179,1), + Cpt::ExifRational(59,1), + Cpt::ExifRational(5999,100)), + Cpt::QNr::NORTH, + Cpt::ExifGpsCoord(Cpt::ExifRational(89,1), + Cpt::ExifRational(59,1), + Cpt::ExifRational(5999,100)) + }, + { + Cpt::QNr::EAST, + Cpt::ExifGpsCoord(Cpt::ExifRational(179,1), + Cpt::ExifRational(59,1), + Cpt::ExifRational(5999,100)), + Cpt::QNr::SOUTH, + Cpt::ExifGpsCoord(Cpt::ExifRational(89,1), + Cpt::ExifRational(59,1), + Cpt::ExifRational(5999,100)) + }, + { + Cpt::QNr::WEST, + Cpt::ExifGpsCoord(Cpt::ExifRational(179,1), + Cpt::ExifRational(59,1), + Cpt::ExifRational(5999,100)), + Cpt::QNr::NORTH, + Cpt::ExifGpsCoord(Cpt::ExifRational(89,1), + Cpt::ExifRational(59,1), + Cpt::ExifRational(5999,100)) + }, + { + Cpt::QNr::WEST, + Cpt::ExifGpsCoord(Cpt::ExifRational(179,1), + Cpt::ExifRational(59,1), + Cpt::ExifRational(5999,100)), + Cpt::QNr::SOUTH, + Cpt::ExifGpsCoord(Cpt::ExifRational(89,1), + Cpt::ExifRational(59,1), + Cpt::ExifRational(5999,100)) + }, +}; + + +std::ostream & operator<<(std::ostream & os, + const GeoData & geoData) +{ + os + << "GPS " + << geoData.gpsLongitudeRef_ << ' ' + << geoData.gpsLongitude_ << ' ' + << geoData.gpsLatitudeRef_ << ' ' + << geoData.gpsLatitude_; + + return os; +} + + +void testPlainGeo(Itk::TestMgr * testMgr) +{ + using namespace std; + using namespace Itk; + using namespace Cpt; + + for (int idx = 0; idx < sizeof(TestData) / sizeof(GeoData); ++idx) + { + GeoData + & geoData(TestData[idx]); + + QNr + qnr(geoData.gpsLatitudeRef_, + geoData.gpsLatitude_, + geoData.gpsLongitudeRef_, + geoData.gpsLongitude_); + + cout << "QNr from " << geoData << endl; + + for (int i = QNr::MAX_LEVEL-1; i >= 0; --i) + { + cout << "level " << i << endl; + + std::wstring + wstr = qnr.toWString(); + + auto_array + str(new char[wstr.length() + 1]); + wcstombs(str.get(), + wstr.c_str(), + wstr.length() + 1); + + cout << "qnr str: " << str.get() << endl; + + int16_t + level = qnr.getLevel(); + + ITK_EXPECT(testMgr, + level == i, + "Qnr level is %d instead of %d", + level, + i); + + double + kmWidth = qnr.getKmWidth(), + kmHeight = qnr.getKmHeight(); + + printf("qnr km width: %16.8f\n", + kmWidth); + printf("qnr km height: %16.8f\n\n", + kmHeight); + + qnr = qnr.getParentQNr(); + } + } +} + + +void printQNrArea(Itk::TestMgr * , + const Cpt::QNr & qnr) +{ + using namespace std; + using namespace Cpt; + + cout << "On level " << qnr.getLevel() << endl; + cout << "C: " << qnr << endl; + + set + adjacents; + qnr.getAdjacents(adjacents); + + cout << "Adjacents: " << endl; + + set::const_iterator + it = adjacents.begin(), + end = adjacents.end(); + + for (; it != end; ++it) + { + cout << " o " << *it << endl; + } +} + + +void testAdjacentQNrs(Itk::TestMgr * testMgr) +{ + using namespace std; + using namespace Itk; + using namespace Cpt; + + for (size_t i = 0; i < sizeof(TestData) / sizeof(GeoData); ++i) + { + GeoData + & geoData = TestData[i]; + + QNr + qnr(geoData.gpsLatitudeRef_, + geoData.gpsLatitude_, + geoData.gpsLongitudeRef_, + geoData.gpsLongitude_); + + cout << "==============" + << " QNr from " << geoData << endl; + + // level 15 + printQNrArea(testMgr, + qnr); + + // level 14 + qnr = qnr.getParentQNr(); + printQNrArea(testMgr, + qnr); + + // level 2 + while (qnr.getLevel() != 2) + { + qnr = qnr.getParentQNr(); + } + printQNrArea(testMgr, + qnr); + + // level 1 + qnr = qnr.getParentQNr(); + printQNrArea(testMgr, + qnr); + + // level 0 + qnr = qnr.getParentQNr(); + printQNrArea(testMgr, + qnr); + + cout << endl; + } +} + + + +Itk::TesterBase * CreateGeoTests() +{ + using namespace Itk; + + SuiteTester + * geoTests = new SuiteTester("geo"); + +#define TEST "plain" + geoTests->add(TEST, + testPlainGeo, + TEST); +#undef TEST + +#define TEST "adjacentQNrs" + geoTests->add(TEST, + testAdjacentQNrs, + TEST); +#undef TEST + + + // ... add more tests to suite + + return geoTests; +} + +