blob: 64b32380ad6d062c8f2daa2cd7c88da7a3223aeb [file] [log] [blame]
// Copyright (C) 2015 The Android Open Source Project
//
// This software is licensed under the terms of the GNU General Public
// License version 2, as published by the Free Software Foundation, and
// may be copied, distributed, and modified under those terms.
//
// 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.
#include "android/base/testing/TestTempDir.h"
#include "android/base/testing/Utils.h"
#include "android/gps/GpxParser.h"
#include <fstream>
#include <gtest/gtest.h>
using android::base::TestTempDir;
namespace android_gps {
TEST(GpxParser, ParseFileNotFound) {
GpsFixArray locations;
std::string error;
bool isOk = GpxParser::parseFile("i_dont_exist.gpx", &locations, &error);
EXPECT_FALSE(isOk);
}
TEST(GpxParser, ParseFileEmpty) {
char text[] =
"<?xml version=\"1.0\"?>"
"<gpx>"
"</gpx>";
TestTempDir myDir("parse_location_tests");
ASSERT_TRUE(myDir.path()); // NULL if error during creation.
std::string path = myDir.makeSubPath("test.gpx");
std::ofstream myfile;
myfile.open(path.c_str());
myfile << text;
myfile.close();
GpsFixArray locations;
std::string error;
bool isOk = GpxParser::parseFile(path.c_str(), &locations, &error);
EXPECT_TRUE(isOk);
EXPECT_EQ(0, locations.size());
}
TEST(GpxParser, ParseFileEmptyRteTrk) {
char text[] =
"<?xml version=\"1.0\"?>"
"<gpx>"
"<rte>"
"</rte>"
"<trk>"
"<trkseg>"
"</trkseg>"
"</trk>"
"</gpx>";
TestTempDir myDir("parse_location_tests");
ASSERT_TRUE(myDir.path()); // NULL if error during creation.
std::string path = myDir.makeSubPath("test.gpx");
std::ofstream myfile;
myfile.open(path.c_str());
myfile << text;
myfile.close();
GpsFixArray locations;
std::string error;
bool isOk = GpxParser::parseFile(path.c_str(), &locations, &error);
EXPECT_TRUE(isOk);
EXPECT_EQ(0, locations.size());
}
TEST(GpxParser, ParseFileValid) {
char text[] =
"<?xml version=\"1.0\"?>"
"<gpx>"
"<wpt lon=\"0\" lat=\"0\">"
"<name>Wpt 1</name>"
"</wpt>"
"<wpt lon=\"0\" lat=\"0\">"
"<name>Wpt 2</name>"
"</wpt>"
"<rte>"
"<rtept lon=\"0\" lat=\"0\">"
"<name>Rtept 1</name>"
"</rtept>"
"<rtept lon=\"0\" lat=\"0\">"
"<name>Rtept 2</name>"
"</rtept>"
"</rte>"
"<trk>"
"<trkseg>"
"<trkpt lon=\"0\" lat=\"0\">"
"<name>Trkpt 1-1</name>"
"</trkpt>"
"<trkpt lon=\"0\" lat=\"0\">"
"<name>Trkpt 1-2</name>"
"</trkpt>"
"</trkseg>"
"<trkseg>"
"<trkpt lon=\"0\" lat=\"0\">"
"<name>Trkpt 2-1</name>"
"</trkpt>"
"<trkpt lon=\"0\" lat=\"0\">"
"<name>Trkpt 2-2</name>"
"</trkpt>"
"</trkseg>"
"</trk>"
"</gpx>";
TestTempDir myDir("parse_location_tests");
ASSERT_TRUE(myDir.path()); // NULL if error during creation.
std::string path = myDir.makeSubPath("test.gpx");
std::ofstream myfile;
myfile.open(path.c_str());
myfile << text;
myfile.close();
GpsFixArray locations;
std::string error;
bool isOk = GpxParser::parseFile(path.c_str(), &locations, &error);
EXPECT_TRUE(isOk);
ASSERT_EQ(8, locations.size());
EXPECT_EQ("Wpt 1", locations[0].name);
EXPECT_EQ("Wpt 2", locations[1].name);
EXPECT_EQ("Rtept 1", locations[2].name);
EXPECT_EQ("Rtept 2", locations[3].name);
EXPECT_EQ("Trkpt 1-1", locations[4].name);
EXPECT_EQ("Trkpt 1-2", locations[5].name);
EXPECT_EQ("Trkpt 2-1", locations[6].name);
EXPECT_EQ("Trkpt 2-2", locations[7].name);
}
TEST(GpxParser, ParseFileNullAttribute) {
char text[] =
"<?xml version=\"1.0\"?>"
"<gpx>"
"<wpt lon=\"0\" lat=\"0\">"
"<name/>"
"</wpt>"
"</gpx>";
TestTempDir myDir("parse_location_tests");
ASSERT_TRUE(myDir.path()); // NULL if error during creation.
std::string path = myDir.makeSubPath("test.gpx");
std::ofstream myfile(path.c_str());
myfile << text;
myfile.close();
GpsFixArray locations;
std::string error;
bool isOk = GpxParser::parseFile(path.c_str(), &locations, &error);
// This test only checks if GpxParser doesn't crash on null attributes
// So if we're here it's already Ok - these tests aren't that relevant.
EXPECT_TRUE(isOk);
EXPECT_EQ(1, locations.size());
EXPECT_STREQ("", locations[0].name.c_str());
EXPECT_TRUE(error.empty());
}
TEST(GpxParser, ParseLocationMissingLatitude) {
char text[] =
"<?xml version=\"1.0\"?>"
"<gpx>"
"<wpt lon=\"9.81\">"
"<ele>6.02</ele>"
"<name>Name</name>"
"<desc>Desc</desc>"
"</wpt>"
"</gpx>";
TestTempDir myDir("parse_location_tests");
ASSERT_TRUE(myDir.path()); // NULL if error during creation.
std::string path = myDir.makeSubPath("test.gpx");
std::ofstream myfile(path.c_str());
myfile << text;
myfile.close();
GpsFixArray locations;
std::string error;
bool isOk = GpxParser::parseFile(path.c_str(), &locations, &error);
EXPECT_FALSE(isOk);
}
TEST(GpxParser, ParseLocationMissingLongitude) {
char text[] =
"<?xml version=\"1.0\"?>"
"<gpx>"
"<wpt lat=\"3.1415\">"
"<ele>6.02</ele>"
"<name>Name</name>"
"<desc>Desc</desc>"
"</wpt>"
"</gpx>";
TestTempDir myDir("parse_location_tests");
ASSERT_TRUE(myDir.path()); // NULL if error during creation.
std::string path = myDir.makeSubPath("test.gpx");
std::ofstream myfile(path.c_str());
myfile << text;
myfile.close();
GpsFixArray locations;
std::string error;
bool isOk = GpxParser::parseFile(path.c_str(), &locations, &error);
EXPECT_FALSE(isOk);
}
TEST(GpxParser, ParseValidLocation) {
char text[] =
"<?xml version=\"1.0\"?>"
"<gpx>"
"<wpt lon=\"9.81\" lat=\"3.1415\">"
"<ele>6.02</ele>"
"<name>Name</name>"
"<desc>Desc</desc>"
"</wpt>"
"</gpx>";
TestTempDir myDir("parse_location_tests");
ASSERT_TRUE(myDir.path()); // NULL if error during creation.
std::string path = myDir.makeSubPath("test.gpx");
std::ofstream myfile(path.c_str());
myfile << text;
myfile.close();
GpsFixArray locations;
std::string error;
bool isOk = GpxParser::parseFile(path.c_str(), &locations, &error);
EXPECT_TRUE(isOk);
EXPECT_EQ(1, locations.size());
const GpsFix& wpt = locations[0];
EXPECT_EQ("Desc", wpt.description);
EXPECT_FLOAT_EQ(6.02, wpt.elevation);
EXPECT_FLOAT_EQ(3.1415, wpt.latitude);
EXPECT_FLOAT_EQ(9.81, wpt.longitude);
EXPECT_EQ("Name", wpt.name);
}
TEST(GpxParser, ParseValidLocationCommaLocale) {
auto scopedCommaLocale = setScopedCommaLocale();
char text[] =
"<?xml version=\"1.0\"?>"
"<gpx>"
"<wpt lon=\"9.81\" lat=\"3.1415\">"
"<ele>6.02</ele>"
"<name>Name</name>"
"<desc>Desc</desc>"
"</wpt>"
"</gpx>";
TestTempDir myDir("parse_location_tests");
ASSERT_TRUE(myDir.path()); // NULL if error during creation.
std::string path = myDir.makeSubPath("test.gpx");
std::ofstream myfile(path.c_str());
myfile << text;
myfile.close();
GpsFixArray locations;
std::string error;
bool isOk = GpxParser::parseFile(path.c_str(), &locations, &error);
EXPECT_TRUE(isOk);
EXPECT_EQ(1, locations.size());
const GpsFix& wpt = locations[0];
EXPECT_EQ("Desc", wpt.description);
EXPECT_FLOAT_EQ(6.02, wpt.elevation);
EXPECT_FLOAT_EQ(3.1415, wpt.latitude);
EXPECT_FLOAT_EQ(9.81, wpt.longitude);
EXPECT_EQ("Name", wpt.name);
}
TEST(GpxParser, ParseValidDocument) {
char text[] =
"<?xml version=\"1.0\"?>"
"<gpx>"
"<wpt lon=\"0\" lat=\"0\">"
"<name>Wpt 1</name>"
"</wpt>"
"<wpt lon=\"0\" lat=\"0\">"
"<name>Wpt 2</name>"
"</wpt>"
"<rte>"
"<rtept lon=\"0\" lat=\"0\">"
"<name>Rtept 1</name>"
"</rtept>"
"<rtept lon=\"0\" lat=\"0\">"
"<name>Rtept 2</name>"
"</rtept>"
"</rte>"
"<trk>"
"<trkseg>"
"<trkpt lon=\"0\" lat=\"0\">"
"<name>Trkpt 1-1</name>"
"</trkpt>"
"<trkpt lon=\"0\" lat=\"0\">"
"<name>Trkpt 1-2</name>"
"</trkpt>"
"</trkseg>"
"<trkseg>"
"<trkpt lon=\"0\" lat=\"0\">"
"<name>Trkpt 2-1</name>"
"</trkpt>"
"<trkpt lon=\"0\" lat=\"0\">"
"<name>Trkpt 2-2</name>"
"</trkpt>"
"</trkseg>"
"</trk>"
"</gpx>";
TestTempDir myDir("parse_location_tests");
ASSERT_TRUE(myDir.path()); // NULL if error during creation.
std::string path = myDir.makeSubPath("test.gpx");
std::ofstream myfile(path.c_str());
myfile << text;
myfile.close();
GpsFixArray locations;
std::string error;
bool isOk = GpxParser::parseFile(path.c_str(), &locations, &error);
EXPECT_TRUE(isOk);
EXPECT_EQ(8, locations.size());
EXPECT_EQ("Wpt 1", locations[0].name);
EXPECT_EQ("Wpt 2", locations[1].name);
EXPECT_EQ("Rtept 1", locations[2].name);
EXPECT_EQ("Rtept 2", locations[3].name);
EXPECT_EQ("Trkpt 1-1", locations[4].name);
EXPECT_EQ("Trkpt 1-2", locations[5].name);
EXPECT_EQ("Trkpt 2-1", locations[6].name);
EXPECT_EQ("Trkpt 2-2", locations[7].name);
}
}