/**
* @file lltranslate_test.cpp
*
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2011, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "linden_common.h"
#include "../test/lltut.h"
#include "../lltranslate.h"
#include "../llversioninfo.h"
#include "../llviewercontrol.h"
#include "llbufferstream.h"
#include "lltrans.h"
#include "llui.h"
#include "../../llmessage/llhttpconstants.cpp"
static const std::string GOOGLE_VALID_RESPONSE1 =
"{\
\"data\": {\
\"translations\": [\
{\
\"translatedText\": \"привет\",\
\"detectedSourceLanguage\": \"es\"\
}\
]\
}\
}";
static const std::string GOOGLE_VALID_RESPONSE2 =
"{\
\"data\": {\
\"translations\": [\
{\
\"translatedText\": \"привет\"\
}\
]\
}\
}\
";
static const std::string GOOGLE_VALID_RESPONSE3 =
"{\
\"error\": {\
\"errors\": [\
{\
\"domain\": \"global\",\
\"reason\": \"invalid\",\
\"message\": \"Invalid Value\"\
}\
],\
\"code\": 400,\
\"message\": \"Invalid Value\"\
}\
}";
static const std::string BING_VALID_RESPONSE1 =
"Привет";
static const std::string BING_VALID_RESPONSE2 =
"
Argument Exception
Method: Translate()
Parameter:
\
Message: 'from' must be a valid language
\
message id=3743.V2_Rest.Translate.58E8454F
";
static const std::string BING_VALID_RESPONSE3 =
"Argument Exception
Method: Translate()
\
Parameter: appId
Message: Invalid appId
\nParameter name: appId
\
message id=3737.V2_Rest.Translate.56016759
";
namespace tut
{
class translate_test
{
protected:
void test_translation(
LLTranslationAPIHandler& handler,
int status, const std::string& resp,
const std::string& exp_trans, const std::string& exp_lang, const std::string& exp_err)
{
std::string translation, detected_lang, err_msg;
bool rc = handler.parseResponse(status, resp, translation, detected_lang, err_msg);
ensure_equals("rc", rc, (status == 200));
ensure_equals("err_msg", err_msg, exp_err);
ensure_equals("translation", translation, exp_trans);
ensure_equals("detected_lang", detected_lang, exp_lang);
}
LLGoogleTranslationHandler mGoogle;
LLBingTranslationHandler mBing;
};
typedef test_group translate_test_group_t;
typedef translate_test_group_t::object translate_test_object_t;
tut::translate_test_group_t tut_translate("LLTranslate");
template<> template<>
void translate_test_object_t::test<1>()
{
test_translation(mGoogle, 200, GOOGLE_VALID_RESPONSE1, "привет", "es", "");
}
template<> template<>
void translate_test_object_t::test<2>()
{
test_translation(mGoogle, 200, GOOGLE_VALID_RESPONSE2, "привет", "", "");
}
template<> template<>
void translate_test_object_t::test<3>()
{
test_translation(mGoogle, 400, GOOGLE_VALID_RESPONSE3, "", "", "Invalid Value");
}
template<> template<>
void translate_test_object_t::test<4>()
{
test_translation(mGoogle, 400,
"",
"", "", "* Line 1, Column 1\n Syntax error: value, object or array expected.\n");
}
template<> template<>
void translate_test_object_t::test<5>()
{
test_translation(mGoogle, 400,
"[]",
"", "", "");
}
template<> template<>
void translate_test_object_t::test<6>()
{
test_translation(mGoogle, 400,
"{\"oops\": \"invalid\"}",
"", "", "");
}
template<> template<>
void translate_test_object_t::test<7>()
{
test_translation(mGoogle, 400,
"{\"data\": {}}",
"", "", "");
}
template<> template<>
void translate_test_object_t::test<8>()
{
test_translation(mGoogle, 400,
"{\"data\": { \"translations\": [ {} ] }}",
"", "", "");
}
template<> template<>
void translate_test_object_t::test<9>()
{
test_translation(mGoogle, 400,
"{\"data\": { \"translations\": [ { \"translatedTextZZZ\": \"привет\", \"detectedSourceLanguageZZZ\": \"es\" } ] }}",
"", "", "");
}
template<> template<>
void translate_test_object_t::test<10>()
{
test_translation(mBing, 200, BING_VALID_RESPONSE1, "Привет", "", "");
}
template<> template<>
void translate_test_object_t::test<11>()
{
test_translation(mBing, 400, BING_VALID_RESPONSE2, "", "", "'from' must be a valid language");
}
template<> template<>
void translate_test_object_t::test<12>()
{
test_translation(mBing, 400, BING_VALID_RESPONSE3, "", "", "Invalid appId\nParameter name: appId");
}
template<> template<>
void translate_test_object_t::test<13>()
{
test_translation(mBing, 200,
"Привет",
"Привет", "", "");
}
template<> template<>
void translate_test_object_t::test<14>()
{
test_translation(mBing, 200,
"Привет",
"Привет", "", "");
}
template<> template<>
void translate_test_object_t::test<15>()
{
test_translation(mBing, 200,
"Привет",
"Привет", "", "");
}
template<> template<>
void translate_test_object_t::test<16>()
{
test_translation(mBing, 400,
"Message: some error",
"", "", "some error");
}
template<> template<>
void translate_test_object_t::test<17>()
{
test_translation(mBing, 400,
"Message: some error",
"", "", "some error");
}
template<> template<>
void translate_test_object_t::test<18>()
{
test_translation(mBing, 400,
"some error",
"", "", "some error");
}
template<> template<>
void translate_test_object_t::test<19>()
{
test_translation(mBing, 400,
"some error",
"", "", "some error");
}
template<> template<>
void translate_test_object_t::test<20>()
{
std::string url;
mBing.getTranslateURL(url, "en", "es", "hi");
ensure_equals("bing URL", url,
"http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=dummy&text=hi&to=es&from=en");
}
template<> template<>
void translate_test_object_t::test<21>()
{
std::string url;
mBing.getTranslateURL(url, "", "es", "hi");
ensure_equals("bing URL", url,
"http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=dummy&text=hi&to=es");
}
template<> template<>
void translate_test_object_t::test<22>()
{
std::string url;
mGoogle.getTranslateURL(url, "en", "es", "hi");
ensure_equals("google URL", url,
"https://www.googleapis.com/language/translate/v2?key=dummy&q=hi&target=es&source=en");
}
template<> template<>
void translate_test_object_t::test<23>()
{
std::string url;
mGoogle.getTranslateURL(url, "", "es", "hi");
ensure_equals("google URL", url,
"https://www.googleapis.com/language/translate/v2?key=dummy&q=hi&target=es");
}
}
//== Misc stubs ===============================================================
LLControlGroup gSavedSettings("test");
std::string LLUI::getLanguage() { return "en"; }
std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args) { return "dummy"; }
LLControlGroup::LLControlGroup(const std::string& name) : LLInstanceTracker(name) {}
std::string LLControlGroup::getString(const std::string& name) { return "dummy"; }
LLControlGroup::~LLControlGroup() {}
LLCurl::Responder::Responder() {}
void LLCurl::Responder::httpFailure() { }
void LLCurl::Responder::httpSuccess() { }
void LLCurl::Responder::httpCompleted() { }
void LLCurl::Responder::completedRaw(LLChannelDescriptors const &,boost::shared_ptr const &) { }
LLCurl::Responder::~Responder() {}
void LLHTTPClient::get(const std::string&, const LLSD&, ResponderPtr, const LLSD&, const F32, bool) {}
void LLHTTPClient::get(const std::string&, LLPointer, const LLSD&, const F32, bool) {}
LLBufferStream::LLBufferStream(const LLChannelDescriptors& channels, LLBufferArray* buffer)
: std::iostream(&mStreamBuf), mStreamBuf(channels, buffer) {}
LLBufferStream::~LLBufferStream() {}
LLBufferStreamBuf::LLBufferStreamBuf(const LLChannelDescriptors&, LLBufferArray*) {}
#if( LL_WINDOWS || __GNUC__ > 2)
LLBufferStreamBuf::pos_type LLBufferStreamBuf::seekoff(
off_type off,
std::ios::seekdir way,
std::ios::openmode which)
#else
streampos LLBufferStreamBuf::seekoff(
streamoff off,
std::ios::seekdir way,
std::ios::openmode which)
#endif
{ return 0; }
int LLBufferStreamBuf::sync() {return 0;}
int LLBufferStreamBuf::underflow() {return 0;}
int LLBufferStreamBuf::overflow(int) {return 0;}
LLBufferStreamBuf::~LLBufferStreamBuf() {}
S32 LLVersionInfo::getBuild() { return 0; }
const std::string& LLVersionInfo::getChannel() {static std::string dummy; return dummy;}
S32 LLVersionInfo::getMajor() { return 0; }
S32 LLVersionInfo::getMinor() { return 0; }
S32 LLVersionInfo::getPatch() { return 0; }