1
0
forked from 0ad/0ad

Updated i18n test system

This was SVN commit r2549.
This commit is contained in:
Ykkrosh 2005-07-26 21:13:52 +00:00
parent c6c8bdc6cd
commit 88724d5f95
15 changed files with 427 additions and 1356 deletions

View File

@ -22,7 +22,7 @@ namespace I18n
vartype_int,
vartype_double,
vartype_string,
vartype_rawstring, // won't be translated automatically
vartype_rawstring // won't be translated automatically
};
class BufferVariable

View File

@ -1,536 +0,0 @@
#include "precompiled.h"
#ifndef CStr_CPP_FIRST
#define CStr_CPP_FIRST
//#include "Network/Serialization.h"
#include "types.h"
#include <cassert>
#define UNIDOUBLER_HEADER "CStr.cpp"
#include "UniDoubler.h"
#else
#include "CStr.h"
using namespace std;
#include <sstream>
CStr::CStr()
{
// Default Constructor
}
CStr::CStr(const CStr& Str)
{
// Copy Constructor
m_String = Str.m_String;
}
CStr::CStr(const TCHAR* String)
{
// Creates CStr from C-Style TCHAR string
m_String = String;
}
CStr::CStr(tstring String)
{
m_String = String;
}
#if !(defined(_MSC_VER) && defined(_UNICODE))
CStr::CStr(utf16string String)
{
m_String = tstring(String.begin(), String.end());
}
#endif
CStr::CStr(TCHAR Char)
{
// Creates CStr from a TCHAR
m_String = Char;
}
CStr::CStr(int Number)
{
std::tstringstream ss;
ss << Number;
ss >> m_String;
}
CStr::CStr(unsigned int Number)
{
std::tstringstream ss;
ss << Number;
ss >> m_String;
}
CStr::CStr(long Number)
{
std::tstringstream ss;
ss << Number;
ss >> m_String;
}
CStr::CStr(unsigned long Number)
{
std::tstringstream ss;
ss << Number;
ss >> m_String;
}
CStr::CStr(float Number)
{
std::tstringstream ss;
ss << Number;
ss >> m_String;
}
CStr::CStr(double Number)
{
std::tstringstream ss;
ss << Number;
ss >> m_String;
}
CStr::~CStr()
{
// Destructor
}
int CStr::ToInt() const
{
return _ttoi(m_String.c_str());
}
unsigned int CStr::ToUInt() const
{
return uint(_ttoi(m_String.c_str()));
}
long CStr::ToLong() const
{
return _ttol(m_String.c_str());
}
unsigned long CStr::ToULong() const
{
return ulong(_ttol(m_String.c_str()));
}
float CStr::ToFloat() const
{
return (float)_tstod(m_String.c_str(), NULL);
}
double CStr::ToDouble() const
{
return _tstod(m_String.c_str(), NULL);
}
//You can retrieve the substring within the string
CStr CStr::GetSubstring(size_t start, size_t len) const
{
return CStr( m_String.substr(start, len) );
}
//Search the string for another string
long CStr::Find(const CStr& Str) const
{
size_t Pos = m_String.find(Str.m_String, 0);
if (Pos != tstring::npos)
return (long)Pos;
return -1;
}
//Search the string for another string
long CStr::Find(const TCHAR &tchar) const
{
size_t Pos = m_String.find(tchar, 0);
if (Pos != tstring::npos)
return (long)Pos;
return -1;
}
//Search the string for another string
long CStr::Find(const int &start, const TCHAR &tchar) const
{
size_t Pos = m_String.find(tchar, start);
if (Pos != tstring::npos)
return (long)Pos;
return -1;
}
long CStr::ReverseFind(const CStr& Str) const
{
size_t Pos = m_String.rfind(Str.m_String, m_String.length() );
if (Pos != tstring::npos)
return (long)Pos;
return -1;
}
// Lowercase and uppercase
CStr CStr::LowerCase() const
{
tstring NewTString = m_String;
for (size_t i = 0; i < m_String.length(); i++)
NewTString[i] = (TCHAR)_totlower(m_String[i]);
return CStr(NewTString);
}
CStr CStr::UpperCase() const
{
tstring NewTString = m_String;
for (size_t i = 0; i < m_String.length(); i++)
NewTString[i] = (TCHAR)_totupper(m_String[i]);
return CStr(NewTString);
}
// Lazy versions
// code duplication because return by value overhead if they were merely an allias
CStr CStr::LCase() const
{
tstring NewTString = m_String;
for (size_t i = 0; i < m_String.length(); i++)
NewTString[i] = (TCHAR)_totlower(m_String[i]);
return CStr(NewTString);
}
CStr CStr::UCase() const
{
tstring NewTString = m_String;
for (size_t i = 0; i < m_String.length(); i++)
NewTString[i] = (TCHAR)_totupper(m_String[i]);
return CStr(NewTString);
}
//Retreive the substring of the first n characters
CStr CStr::Left(long len) const
{
return CStr( m_String.substr(0, len) );
}
//Retreive the substring of the last n characters
CStr CStr::Right(long len) const
{
return CStr( m_String.substr(m_String.length()-len, len) );
}
//Remove all occurences of some character or substring
void CStr::Remove(const CStr& Str)
{
size_t FoundAt = 0;
while (FoundAt != tstring::npos)
{
FoundAt = m_String.find(Str.m_String, 0);
if (FoundAt != tstring::npos)
m_String.erase(FoundAt, Str.m_String.length());
}
}
//Replace all occurences of some substring by another
void CStr::Replace(const CStr& ToReplace, const CStr& ReplaceWith)
{
size_t Pos = 0;
while (Pos != tstring::npos)
{
Pos = m_String.find(ToReplace.m_String, Pos);
if (Pos != tstring::npos)
{
m_String.erase(Pos, ToReplace.m_String.length());
m_String.insert(Pos, ReplaceWith.m_String);
Pos += ReplaceWith.m_String.length();
}
}
}
// returns a trimed string, removes whitespace from the left/right/both
CStr CStr::Trim(PS_TRIM_MODE Mode)
{
size_t Left = 0, Right = 0;
switch (Mode)
{
case PS_TRIM_LEFT:
{
for (Left = 0; Left < m_String.length(); Left++)
if (_istspace(m_String[Left]) == false)
break; // end found, trim 0 to Left-1 inclusive
} break;
case PS_TRIM_RIGHT:
{
Right = m_String.length();
while (Right--)
if (_istspace(m_String[Right]) == false)
break; // end found, trim len-1 to Right+1 inclusive
} break;
case PS_TRIM_BOTH:
{
for (Left = 0; Left < m_String.length(); Left++)
if (_istspace(m_String[Left]) == false)
break; // end found, trim 0 to Left-1 inclusive
Right = m_String.length();
while (Right--)
if (_istspace(m_String[Right]) == false)
break; // end found, trim len-1 to Right+1 inclusive
} break;
default:
debug_warn("CStr::Trim: invalid Mode");
}
return CStr( m_String.substr(Left, Right-Left+1) );
}
// Overload operations
CStr& CStr::operator=(const CStr& Str)
{
m_String = Str.m_String;
return *this;
}
CStr& CStr::operator=(const TCHAR* String)
{
m_String = String;
return *this;
}
CStr& CStr::operator=(TCHAR Char)
{
m_String = Char;
return *this;
}
CStr& CStr::operator=(int Number)
{
std::tstringstream ss;
ss << Number;
ss >> m_String;
return *this;
}
CStr& CStr::operator=(long Number)
{
std::tstringstream ss;
ss << Number;
ss >> m_String;
return *this;
}
CStr& CStr::operator=(unsigned int Number)
{
std::tstringstream ss;
ss << Number;
ss >> m_String;
return *this;
}
CStr& CStr::operator=(unsigned long Number)
{
std::tstringstream ss;
ss << Number;
ss >> m_String;
return *this;
}
CStr& CStr::operator=(float Number)
{
std::tstringstream ss;
ss << Number;
ss >> m_String;
return *this;
}
CStr& CStr::operator=(double Number)
{
std::tstringstream ss;
ss << Number;
ss >> m_String;
return *this;
}
bool CStr::operator==(const CStr& Str) const
{
return (m_String == Str.m_String);
}
bool CStr::operator!=(const CStr& Str) const
{
return (m_String != Str.m_String);
}
bool CStr::operator<(const CStr& Str) const
{
return (m_String < Str.m_String);
}
bool CStr::operator<=(const CStr& Str) const
{
return (m_String <= Str.m_String);
}
bool CStr::operator>(const CStr& Str) const
{
return (m_String > Str.m_String);
}
bool CStr::operator>=(const CStr& Str) const
{
return (m_String >= Str.m_String);
}
CStr& CStr::operator+=(const CStr& Str)
{
m_String += Str.m_String;
return *this;
}
CStr CStr::operator+(const CStr& Str)
{
CStr NewStr(*this);
NewStr.m_String += Str.m_String;
return NewStr;
}
CStr::operator const TCHAR*()
{
return m_String.c_str();
}
CStr::operator const TCHAR*() const
{
return m_String.c_str();
}
TCHAR &CStr::operator[](int n)
{
assert((size_t)n < m_String.length());
return m_String[n];
}
TCHAR &CStr::operator[](unsigned int n)
{
assert(n < m_String.length());
return m_String[n];
}
TCHAR &CStr::operator[](long n)
{
assert((size_t)n < m_String.length());
return m_String[n];
}
TCHAR &CStr::operator[](unsigned long n)
{
assert(n < m_String.length());
return m_String[n];
}
ostream &operator<<(ostream &os, CStr& Str)
{
os << (const TCHAR*)Str;
return os;
}
//size_t CStr::GetHashCode() const
//{
// return (size_t)fnv_hash64(m_String.data(), m_String.length());
// // janwas asks: do we care about the hash being 64 bits?
// // it is truncated here on 32-bit systems; why go 64 bit at all?
//}
//
//uint CStr::GetSerializedLength() const
//{
// return uint(m_String.length()*2 + 2);
//}
//
//#ifdef _UNICODE
///*
// CStrW is always serialized to/from UTF-16
//*/
//
//u8 *CStrW::Serialize(u8 *buffer) const
//{
// size_t length=m_String.length();
// size_t i=0;
// for (i=0;i<length;i++)
// *(u16 *)(buffer+i*2)=htons(m_String[i]);
// *(u16 *)(buffer+i*2)=0;
// return buffer+length*2+2;
//}
//
//const u8 *CStrW::Deserialize(const u8 *buffer, const u8 *bufferend)
//{
// const u16 *strend=(const u16 *)buffer;
// while ((const u8 *)strend < bufferend && *strend) strend++;
// if ((const u8 *)strend >= bufferend) return NULL;
//
// m_String.resize(strend-((const u16 *)buffer));
// size_t i=0;
// const u16 *ptr=(const u16 *)buffer;
// while (ptr<strend)
// m_String[i++]=(TCHAR)ntohs(*(ptr++));
//
// return (const u8 *)(strend+1);
//}
//#else
///*
// CStr8 is always serialized to/from ASCII (or whatever 8-bit codepage stored
// in the CStr)
//*/
//
//u8 *CStr8::Serialize(u8 *buffer) const
//{
// size_t length=m_String.length();
// size_t i=0;
// for (i=0;i<length;i++)
// buffer[i]=m_String[i];
// buffer[i]=0;
// return buffer+length+1;
//}
//
//const u8 *CStr8::Deserialize(const u8 *buffer, const u8 *bufferend)
//{
// const u8 *strend=buffer;
// while (strend < bufferend && *strend) strend++;
// if (strend >= bufferend) return NULL;
//
// m_String=std::string(buffer, strend);
//
// return strend+1;
//}
//#endif
#endif

View File

@ -1,249 +1,6 @@
// Hacked version to minimise dependencies
/*
CStr.h
by Caecus
Caecus@0ad.wildfiregames.com
Overview:
Contains CStr class which is a versatile class for making string use easy.
Basic functionality implemented via STL string, so performance is limited
based on the STL implementation we use.
Example:
CStr MyString = _T("Hello, World.");
int MyNum = 126;
MyString += _T(" I'm the number ") += CStr(MyNumber);
// Prints "Hello, World. I'm the number 126"
_tcout << (LPCTSTR)MyString << endl;
MyString = _("2341");
MyNum = MyString.ToInt();
// Prints "2341"
_tcout << MyNum << endl;
More Info:
http://wildfiregames.com/0ad/codepit/TDD/CStr.html
*/
// history:
// 19 May 04, Mark Thompson (mot20@cam.ac.uk / mark@wildfiregames.com)
// 2004-06-18 janwas: replaced conversion buffer with stringstream
#ifndef CSTR_H_FIRST
#define CSTR_H_FIRST
enum PS_TRIM_MODE {PS_TRIM_LEFT, PS_TRIM_RIGHT, PS_TRIM_BOTH};
#ifndef IN_UNIDOUBLER
#define UNIDOUBLER_HEADER "CStr.h"
#include "UniDoubler.h"
#endif
#endif
#if !defined(CSTR_H) || defined(IN_UNIDOUBLER)
#define CSTR_H
//#include "Prometheus.h"
#include <string> // Used for basic string functionality
#include <iostream>
#include "utf16string.h"
//#include "Network/Serialization.h"
#include <cstdlib>
#ifdef _UNICODE
#define tstring wstring
#define tstringstream wstringstream
#define _tcout wcout
#define _tstod wcstod
#define TCHAR wchar_t
#define _ttoi(a) wcstol(a, NULL, 0)
#define _ttol(a) wcstol(a, NULL, 0)
#define _T(t) L ## t
#define _istspace iswspace
#define _tsnprintf swprintf
#define _totlower towlower
#define _totupper towupper
#else
#define tstringstream stringstream
#define tstring string
#define _tcout cout
#define _tstod strtod
#define _ttoi atoi
#define _ttol atol
#define TCHAR char
#define _T(t) t
#define _istspace isspace
#define _tsnprintf snprintf
#define _totlower tolower
#define _totupper toupper
#endif
// CStr class, the mother of all strings
class CStr//: public ISerializable
{
#ifdef _UNICODE
friend class CStr8;
#endif
public:
// CONSTRUCTORS
CStr(); // Default constructor
CStr(const CStr& Str); // Copy Constructor
// Transparent CStrW/8 conversion. Note that CStr8 will provide both
// definitions since CStrW is defined first - would otherwise result in a
// circular dependency
#ifndef _UNICODE
inline CStr8(const CStrW &wideStr):
m_String(wideStr.m_String.begin(), wideStr.m_String.end())
{}
inline operator CStrW ()
{
return CStrW(std::wstring(m_String.begin(), m_String.end()));
}
#endif
CStr(std::tstring String); // Creates CStr from C++ string
#if !(defined(_MSC_VER) && defined(_UNICODE))
CStr(utf16string String); // Creates CStr from UTF16 string, potentially losing data in UTF16->ASCII conversions
#endif
CStr(const TCHAR* String); // Creates CStr from C-Style TCHAR string
CStr(TCHAR Char); // Creates CStr from a TCHAR
CStr(int Number); // Creates CStr from a int
CStr(unsigned int Number); // Creates CStr from a uint
CStr(long Number); // Creates CStr from a long
CStr(unsigned long Number); // Creates CStr from a ulong
CStr(float Number); // Creates CStr from a float
CStr(double Number); // Creates CStr from a double
~CStr(); // Destructor
// Conversions
int ToInt() const;
unsigned int ToUInt() const;
long ToLong() const;
unsigned long ToULong() const;
float ToFloat() const;
double ToDouble() const;
size_t Length() const {return m_String.length();}
// Retrieves the substring within the string
CStr GetSubstring(size_t start, size_t len) const;
//Search the string for another string
long Find(const CStr& Str) const;
//Search the string for another string
long Find(const TCHAR &tchar) const;
//Search the string for another string
long Find(const int &start, const TCHAR &tchar) const;
//You can also do a "ReverseFind"- i.e. search starting from the end
long ReverseFind(const CStr& Str) const;
// Lowercase and uppercase
CStr LowerCase() const;
CStr UpperCase() const;
// Lazy funcs
CStr LCase() const;
CStr UCase() const;
// Retreive the substring of the first n characters
CStr Left(long len) const;
// Retreive the substring of the last n characters
CStr Right(long len) const;
//Remove all occurences of some character or substring
void Remove(const CStr& Str);
//Replace all occurences of some substring by another
void Replace(const CStr& StrToReplace, const CStr& ReplaceWith);
// Returns a trimed string, removes whitespace from the left/right/both
CStr Trim(PS_TRIM_MODE Mode);
// Overload operations
CStr& operator=(const CStr& Str);
CStr& operator=(const TCHAR* String);
CStr& operator=(TCHAR Char);
CStr& operator=(int Number);
CStr& operator=(long Number);
CStr& operator=(unsigned int Number);
CStr& operator=(unsigned long Number);
CStr& operator=(float Number);
CStr& operator=(double Number);
bool operator==(const CStr& Str) const;
bool operator!=(const CStr& Str) const;
bool operator<(const CStr& Str) const;
bool operator<=(const CStr& Str) const;
bool operator>(const CStr& Str) const;
bool operator>=(const CStr& Str) const;
CStr& operator+=(const CStr& Str);
CStr operator+(const CStr& Str);
operator const TCHAR*();
operator const TCHAR*() const; // Gee, I've added this, Maybe the one above should be removed?
TCHAR &operator[](int n);
TCHAR &operator[](unsigned int n);
TCHAR &operator[](long n);
TCHAR &operator[](unsigned long n);
inline const TCHAR *c_str() const
{ return m_String.c_str(); }
inline utf16string utf16() const
{ return utf16string(m_String.begin(), m_String.end()); }
size_t GetHashCode() const;
// Serialization functions
// virtual uint GetSerializedLength() const;
// virtual u8 *Serialize(u8 *buffer) const;
// virtual const u8 *Deserialize(const u8 *buffer, const u8 *bufferend);
protected:
std::tstring m_String;
};
class CStr_hash_compare
class CStr : public std::string {};
class CStrW : public std::wstring
{
public:
static const size_t bucket_size = 1;
static const size_t min_buckets = 16;
size_t operator()( const CStr& Key ) const
{
return( Key.GetHashCode() );
}
bool operator()( const CStr& _Key1, const CStr& _Key2 ) const
{
return( _Key1 < _Key2 );
}
CStrW(const std::wstring &s) : std::wstring(s) {}
};
// overloaded operator for ostreams
std::ostream &operator<<(std::ostream &os, CStr& Str);
#endif
// Hacks to make VAssist happy:
#ifdef PLEASE_DO_NOT_EVER_DEFINE_THIS
class CStrW : public CStr;
class CStr8 : public CStr;
#endif

View File

@ -1,265 +0,0 @@
// Auto-generated by errorlist.pl - do not edit.
#include "precompiled.h"
#include "Errors.h"
class PSERROR_CVFSFile : public PSERROR {};
class PSERROR_Error : public PSERROR {};
class PSERROR_GUI : public PSERROR {};
class PSERROR_Game : public PSERROR {};
class PSERROR_I18n : public PSERROR {};
class PSERROR_Renderer : public PSERROR {};
class PSERROR_Scripting : public PSERROR {};
class PSERROR_System : public PSERROR {};
class PSERROR_Xeromyces : public PSERROR {};
class PSERROR_Game_World : public PSERROR_Game {};
class PSERROR_I18n_Script : public PSERROR_I18n {};
class PSERROR_Scripting_DefineType : public PSERROR_Scripting {};
class PSERROR_Scripting_LoadFile : public PSERROR_Scripting {};
class PSERROR_CVFSFile_AlreadyLoaded : public PSERROR_CVFSFile { public: PSERROR_CVFSFile_AlreadyLoaded(); };
class PSERROR_CVFSFile_InvalidBufferAccess : public PSERROR_CVFSFile { public: PSERROR_CVFSFile_InvalidBufferAccess(); };
class PSERROR_CVFSFile_LoadFailed : public PSERROR_CVFSFile { public: PSERROR_CVFSFile_LoadFailed(); };
class PSERROR_Error_InvalidError : public PSERROR_Error { public: PSERROR_Error_InvalidError(); };
class PSERROR_GUI_JSOpenFailed : public PSERROR_GUI { public: PSERROR_GUI_JSOpenFailed(); };
class PSERROR_Game_World_MapLoadFailed : public PSERROR_Game_World { public: PSERROR_Game_World_MapLoadFailed(); };
class PSERROR_I18n_Script_SetupFailed : public PSERROR_I18n_Script { public: PSERROR_I18n_Script_SetupFailed(); };
class PSERROR_Renderer_VBOFailed : public PSERROR_Renderer { public: PSERROR_Renderer_VBOFailed(); };
class PSERROR_Scripting_CallFunctionFailed : public PSERROR_Scripting { public: PSERROR_Scripting_CallFunctionFailed(); };
class PSERROR_Scripting_ContextCreationFailed : public PSERROR_Scripting { public: PSERROR_Scripting_ContextCreationFailed(); };
class PSERROR_Scripting_ConversionFailed : public PSERROR_Scripting { public: PSERROR_Scripting_ConversionFailed(); };
class PSERROR_Scripting_CreateObjectFailed : public PSERROR_Scripting { public: PSERROR_Scripting_CreateObjectFailed(); };
class PSERROR_Scripting_DefineConstantFailed : public PSERROR_Scripting { public: PSERROR_Scripting_DefineConstantFailed(); };
class PSERROR_Scripting_DefineType_AlreadyExists : public PSERROR_Scripting_DefineType { public: PSERROR_Scripting_DefineType_AlreadyExists(); };
class PSERROR_Scripting_DefineType_CreationFailed : public PSERROR_Scripting_DefineType { public: PSERROR_Scripting_DefineType_CreationFailed(); };
class PSERROR_Scripting_GlobalObjectCreationFailed : public PSERROR_Scripting { public: PSERROR_Scripting_GlobalObjectCreationFailed(); };
class PSERROR_Scripting_LoadFile_EvalErrors : public PSERROR_Scripting_LoadFile { public: PSERROR_Scripting_LoadFile_EvalErrors(); };
class PSERROR_Scripting_LoadFile_OpenFailed : public PSERROR_Scripting_LoadFile { public: PSERROR_Scripting_LoadFile_OpenFailed(); };
class PSERROR_Scripting_NativeFunctionSetupFailed : public PSERROR_Scripting { public: PSERROR_Scripting_NativeFunctionSetupFailed(); };
class PSERROR_Scripting_RegisterFunctionFailed : public PSERROR_Scripting { public: PSERROR_Scripting_RegisterFunctionFailed(); };
class PSERROR_Scripting_RuntimeCreationFailed : public PSERROR_Scripting { public: PSERROR_Scripting_RuntimeCreationFailed(); };
class PSERROR_Scripting_StandardClassSetupFailed : public PSERROR_Scripting { public: PSERROR_Scripting_StandardClassSetupFailed(); };
class PSERROR_Scripting_TypeDoesNotExist : public PSERROR_Scripting { public: PSERROR_Scripting_TypeDoesNotExist(); };
class PSERROR_System_RequiredExtensionsMissing : public PSERROR_System { public: PSERROR_System_RequiredExtensionsMissing(); };
class PSERROR_System_SDLInitFailed : public PSERROR_System { public: PSERROR_System_SDLInitFailed(); };
class PSERROR_System_VmodeFailed : public PSERROR_System { public: PSERROR_System_VmodeFailed(); };
class PSERROR_Xeromyces_XMLOpenFailed : public PSERROR_Xeromyces { public: PSERROR_Xeromyces_XMLOpenFailed(); };
class PSERROR_Xeromyces_XMLParseError : public PSERROR_Xeromyces { public: PSERROR_Xeromyces_XMLParseError(); };
extern const PSRETURN PSRETURN_CVFSFile_AlreadyLoaded = 0x01000001;
extern const PSRETURN PSRETURN_CVFSFile_InvalidBufferAccess = 0x01000002;
extern const PSRETURN PSRETURN_CVFSFile_LoadFailed = 0x01000003;
extern const PSRETURN PSRETURN_Error_InvalidError = 0x02000001;
extern const PSRETURN PSRETURN_GUI_JSOpenFailed = 0x03000001;
extern const PSRETURN PSRETURN_Game_World_MapLoadFailed = 0x04040001;
extern const PSRETURN PSRETURN_I18n_Script_SetupFailed = 0x05030001;
extern const PSRETURN PSRETURN_Renderer_VBOFailed = 0x06000001;
extern const PSRETURN PSRETURN_Scripting_DefineType_AlreadyExists = 0x07010001;
extern const PSRETURN PSRETURN_Scripting_DefineType_CreationFailed = 0x07010002;
extern const PSRETURN PSRETURN_Scripting_LoadFile_EvalErrors = 0x07020001;
extern const PSRETURN PSRETURN_Scripting_LoadFile_OpenFailed = 0x07020002;
extern const PSRETURN PSRETURN_Scripting_CallFunctionFailed = 0x07000001;
extern const PSRETURN PSRETURN_Scripting_ContextCreationFailed = 0x07000002;
extern const PSRETURN PSRETURN_Scripting_ConversionFailed = 0x07000003;
extern const PSRETURN PSRETURN_Scripting_CreateObjectFailed = 0x07000004;
extern const PSRETURN PSRETURN_Scripting_DefineConstantFailed = 0x07000005;
extern const PSRETURN PSRETURN_Scripting_GlobalObjectCreationFailed = 0x07000006;
extern const PSRETURN PSRETURN_Scripting_NativeFunctionSetupFailed = 0x07000007;
extern const PSRETURN PSRETURN_Scripting_RegisterFunctionFailed = 0x07000008;
extern const PSRETURN PSRETURN_Scripting_RuntimeCreationFailed = 0x07000009;
extern const PSRETURN PSRETURN_Scripting_StandardClassSetupFailed = 0x0700000a;
extern const PSRETURN PSRETURN_Scripting_TypeDoesNotExist = 0x0700000b;
extern const PSRETURN PSRETURN_System_RequiredExtensionsMissing = 0x08000001;
extern const PSRETURN PSRETURN_System_SDLInitFailed = 0x08000002;
extern const PSRETURN PSRETURN_System_VmodeFailed = 0x08000003;
extern const PSRETURN PSRETURN_Xeromyces_XMLOpenFailed = 0x09000001;
extern const PSRETURN PSRETURN_Xeromyces_XMLParseError = 0x09000002;
extern const PSRETURN MASK__PSRETURN_CVFSFile = 0xff000000;
extern const PSRETURN CODE__PSRETURN_CVFSFile = 0x01000000;
extern const PSRETURN MASK__PSRETURN_Error = 0xff000000;
extern const PSRETURN CODE__PSRETURN_Error = 0x02000000;
extern const PSRETURN MASK__PSRETURN_GUI = 0xff000000;
extern const PSRETURN CODE__PSRETURN_GUI = 0x03000000;
extern const PSRETURN MASK__PSRETURN_Game = 0xff000000;
extern const PSRETURN CODE__PSRETURN_Game = 0x04000000;
extern const PSRETURN MASK__PSRETURN_I18n = 0xff000000;
extern const PSRETURN CODE__PSRETURN_I18n = 0x05000000;
extern const PSRETURN MASK__PSRETURN_Renderer = 0xff000000;
extern const PSRETURN CODE__PSRETURN_Renderer = 0x06000000;
extern const PSRETURN MASK__PSRETURN_Scripting = 0xff000000;
extern const PSRETURN CODE__PSRETURN_Scripting = 0x07000000;
extern const PSRETURN MASK__PSRETURN_System = 0xff000000;
extern const PSRETURN CODE__PSRETURN_System = 0x08000000;
extern const PSRETURN MASK__PSRETURN_Xeromyces = 0xff000000;
extern const PSRETURN CODE__PSRETURN_Xeromyces = 0x09000000;
extern const PSRETURN MASK__PSRETURN_Game_World = 0xffff0000;
extern const PSRETURN CODE__PSRETURN_Game_World = 0x04040000;
extern const PSRETURN MASK__PSRETURN_I18n_Script = 0xffff0000;
extern const PSRETURN CODE__PSRETURN_I18n_Script = 0x05030000;
extern const PSRETURN MASK__PSRETURN_Scripting_DefineType = 0xffff0000;
extern const PSRETURN CODE__PSRETURN_Scripting_DefineType = 0x07010000;
extern const PSRETURN MASK__PSRETURN_Scripting_LoadFile = 0xffff0000;
extern const PSRETURN CODE__PSRETURN_Scripting_LoadFile = 0x07020000;
extern const PSRETURN MASK__PSRETURN_CVFSFile_AlreadyLoaded = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_CVFSFile_AlreadyLoaded = 0x01000001;
extern const PSRETURN MASK__PSRETURN_CVFSFile_InvalidBufferAccess = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_CVFSFile_InvalidBufferAccess = 0x01000002;
extern const PSRETURN MASK__PSRETURN_CVFSFile_LoadFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_CVFSFile_LoadFailed = 0x01000003;
extern const PSRETURN MASK__PSRETURN_Error_InvalidError = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Error_InvalidError = 0x02000001;
extern const PSRETURN MASK__PSRETURN_GUI_JSOpenFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_GUI_JSOpenFailed = 0x03000001;
extern const PSRETURN MASK__PSRETURN_Game_World_MapLoadFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Game_World_MapLoadFailed = 0x04040001;
extern const PSRETURN MASK__PSRETURN_I18n_Script_SetupFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_I18n_Script_SetupFailed = 0x05030001;
extern const PSRETURN MASK__PSRETURN_Renderer_VBOFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Renderer_VBOFailed = 0x06000001;
extern const PSRETURN MASK__PSRETURN_Scripting_DefineType_AlreadyExists = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Scripting_DefineType_AlreadyExists = 0x07010001;
extern const PSRETURN MASK__PSRETURN_Scripting_DefineType_CreationFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Scripting_DefineType_CreationFailed = 0x07010002;
extern const PSRETURN MASK__PSRETURN_Scripting_LoadFile_EvalErrors = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Scripting_LoadFile_EvalErrors = 0x07020001;
extern const PSRETURN MASK__PSRETURN_Scripting_LoadFile_OpenFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Scripting_LoadFile_OpenFailed = 0x07020002;
extern const PSRETURN MASK__PSRETURN_Scripting_CallFunctionFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Scripting_CallFunctionFailed = 0x07000001;
extern const PSRETURN MASK__PSRETURN_Scripting_ContextCreationFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Scripting_ContextCreationFailed = 0x07000002;
extern const PSRETURN MASK__PSRETURN_Scripting_ConversionFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Scripting_ConversionFailed = 0x07000003;
extern const PSRETURN MASK__PSRETURN_Scripting_CreateObjectFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Scripting_CreateObjectFailed = 0x07000004;
extern const PSRETURN MASK__PSRETURN_Scripting_DefineConstantFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Scripting_DefineConstantFailed = 0x07000005;
extern const PSRETURN MASK__PSRETURN_Scripting_GlobalObjectCreationFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Scripting_GlobalObjectCreationFailed = 0x07000006;
extern const PSRETURN MASK__PSRETURN_Scripting_NativeFunctionSetupFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Scripting_NativeFunctionSetupFailed = 0x07000007;
extern const PSRETURN MASK__PSRETURN_Scripting_RegisterFunctionFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Scripting_RegisterFunctionFailed = 0x07000008;
extern const PSRETURN MASK__PSRETURN_Scripting_RuntimeCreationFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Scripting_RuntimeCreationFailed = 0x07000009;
extern const PSRETURN MASK__PSRETURN_Scripting_StandardClassSetupFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Scripting_StandardClassSetupFailed = 0x0700000a;
extern const PSRETURN MASK__PSRETURN_Scripting_TypeDoesNotExist = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Scripting_TypeDoesNotExist = 0x0700000b;
extern const PSRETURN MASK__PSRETURN_System_RequiredExtensionsMissing = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_System_RequiredExtensionsMissing = 0x08000001;
extern const PSRETURN MASK__PSRETURN_System_SDLInitFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_System_SDLInitFailed = 0x08000002;
extern const PSRETURN MASK__PSRETURN_System_VmodeFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_System_VmodeFailed = 0x08000003;
extern const PSRETURN MASK__PSRETURN_Xeromyces_XMLOpenFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Xeromyces_XMLOpenFailed = 0x09000001;
extern const PSRETURN MASK__PSRETURN_Xeromyces_XMLParseError = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Xeromyces_XMLParseError = 0x09000002;
PSERROR_CVFSFile_AlreadyLoaded::PSERROR_CVFSFile_AlreadyLoaded() { magic=0x45725221; code=0x01000001; }
PSERROR_CVFSFile_InvalidBufferAccess::PSERROR_CVFSFile_InvalidBufferAccess() { magic=0x45725221; code=0x01000002; }
PSERROR_CVFSFile_LoadFailed::PSERROR_CVFSFile_LoadFailed() { magic=0x45725221; code=0x01000003; }
PSERROR_Error_InvalidError::PSERROR_Error_InvalidError() { magic=0x45725221; code=0x02000001; }
PSERROR_GUI_JSOpenFailed::PSERROR_GUI_JSOpenFailed() { magic=0x45725221; code=0x03000001; }
PSERROR_Game_World_MapLoadFailed::PSERROR_Game_World_MapLoadFailed() { magic=0x45725221; code=0x04040001; }
PSERROR_I18n_Script_SetupFailed::PSERROR_I18n_Script_SetupFailed() { magic=0x45725221; code=0x05030001; }
PSERROR_Renderer_VBOFailed::PSERROR_Renderer_VBOFailed() { magic=0x45725221; code=0x06000001; }
PSERROR_Scripting_DefineType_AlreadyExists::PSERROR_Scripting_DefineType_AlreadyExists() { magic=0x45725221; code=0x07010001; }
PSERROR_Scripting_DefineType_CreationFailed::PSERROR_Scripting_DefineType_CreationFailed() { magic=0x45725221; code=0x07010002; }
PSERROR_Scripting_LoadFile_EvalErrors::PSERROR_Scripting_LoadFile_EvalErrors() { magic=0x45725221; code=0x07020001; }
PSERROR_Scripting_LoadFile_OpenFailed::PSERROR_Scripting_LoadFile_OpenFailed() { magic=0x45725221; code=0x07020002; }
PSERROR_Scripting_CallFunctionFailed::PSERROR_Scripting_CallFunctionFailed() { magic=0x45725221; code=0x07000001; }
PSERROR_Scripting_ContextCreationFailed::PSERROR_Scripting_ContextCreationFailed() { magic=0x45725221; code=0x07000002; }
PSERROR_Scripting_ConversionFailed::PSERROR_Scripting_ConversionFailed() { magic=0x45725221; code=0x07000003; }
PSERROR_Scripting_CreateObjectFailed::PSERROR_Scripting_CreateObjectFailed() { magic=0x45725221; code=0x07000004; }
PSERROR_Scripting_DefineConstantFailed::PSERROR_Scripting_DefineConstantFailed() { magic=0x45725221; code=0x07000005; }
PSERROR_Scripting_GlobalObjectCreationFailed::PSERROR_Scripting_GlobalObjectCreationFailed() { magic=0x45725221; code=0x07000006; }
PSERROR_Scripting_NativeFunctionSetupFailed::PSERROR_Scripting_NativeFunctionSetupFailed() { magic=0x45725221; code=0x07000007; }
PSERROR_Scripting_RegisterFunctionFailed::PSERROR_Scripting_RegisterFunctionFailed() { magic=0x45725221; code=0x07000008; }
PSERROR_Scripting_RuntimeCreationFailed::PSERROR_Scripting_RuntimeCreationFailed() { magic=0x45725221; code=0x07000009; }
PSERROR_Scripting_StandardClassSetupFailed::PSERROR_Scripting_StandardClassSetupFailed() { magic=0x45725221; code=0x0700000a; }
PSERROR_Scripting_TypeDoesNotExist::PSERROR_Scripting_TypeDoesNotExist() { magic=0x45725221; code=0x0700000b; }
PSERROR_System_RequiredExtensionsMissing::PSERROR_System_RequiredExtensionsMissing() { magic=0x45725221; code=0x08000001; }
PSERROR_System_SDLInitFailed::PSERROR_System_SDLInitFailed() { magic=0x45725221; code=0x08000002; }
PSERROR_System_VmodeFailed::PSERROR_System_VmodeFailed() { magic=0x45725221; code=0x08000003; }
PSERROR_Xeromyces_XMLOpenFailed::PSERROR_Xeromyces_XMLOpenFailed() { magic=0x45725221; code=0x09000001; }
PSERROR_Xeromyces_XMLParseError::PSERROR_Xeromyces_XMLParseError() { magic=0x45725221; code=0x09000002; }
const wchar_t* GetErrorString(PSRETURN code)
{
switch (code)
{
case 0x01000001: return L"CVFSFile_AlreadyLoaded";
case 0x01000002: return L"CVFSFile_InvalidBufferAccess";
case 0x01000003: return L"CVFSFile_LoadFailed";
case 0x02000001: return L"Error_InvalidError";
case 0x03000001: return L"GUI_JSOpenFailed";
case 0x04040001: return L"Game_World_MapLoadFailed";
case 0x05030001: return L"I18n_Script_SetupFailed";
case 0x06000001: return L"Renderer_VBOFailed";
case 0x07010001: return L"Scripting_DefineType_AlreadyExists";
case 0x07010002: return L"Scripting_DefineType_CreationFailed";
case 0x07020001: return L"Scripting_LoadFile_EvalErrors";
case 0x07020002: return L"Scripting_LoadFile_OpenFailed";
case 0x07000001: return L"Scripting_CallFunctionFailed";
case 0x07000002: return L"Scripting_ContextCreationFailed";
case 0x07000003: return L"Scripting_ConversionFailed";
case 0x07000004: return L"Scripting_CreateObjectFailed";
case 0x07000005: return L"Scripting_DefineConstantFailed";
case 0x07000006: return L"Scripting_GlobalObjectCreationFailed";
case 0x07000007: return L"Scripting_NativeFunctionSetupFailed";
case 0x07000008: return L"Scripting_RegisterFunctionFailed";
case 0x07000009: return L"Scripting_RuntimeCreationFailed";
case 0x0700000a: return L"Scripting_StandardClassSetupFailed";
case 0x0700000b: return L"Scripting_TypeDoesNotExist";
case 0x08000001: return L"System_RequiredExtensionsMissing";
case 0x08000002: return L"System_SDLInitFailed";
case 0x08000003: return L"System_VmodeFailed";
case 0x09000001: return L"Xeromyces_XMLOpenFailed";
case 0x09000002: return L"Xeromyces_XMLParseError";
default: return L"Unrecognised error";
}
}
void ThrowError(PSRETURN code)
{
switch (code) // Use 'break' in case someone tries to continue from the exception
{
case 0x01000001: throw PSERROR_CVFSFile_AlreadyLoaded(); break;
case 0x01000002: throw PSERROR_CVFSFile_InvalidBufferAccess(); break;
case 0x01000003: throw PSERROR_CVFSFile_LoadFailed(); break;
case 0x02000001: throw PSERROR_Error_InvalidError(); break;
case 0x03000001: throw PSERROR_GUI_JSOpenFailed(); break;
case 0x04040001: throw PSERROR_Game_World_MapLoadFailed(); break;
case 0x05030001: throw PSERROR_I18n_Script_SetupFailed(); break;
case 0x06000001: throw PSERROR_Renderer_VBOFailed(); break;
case 0x07010001: throw PSERROR_Scripting_DefineType_AlreadyExists(); break;
case 0x07010002: throw PSERROR_Scripting_DefineType_CreationFailed(); break;
case 0x07020001: throw PSERROR_Scripting_LoadFile_EvalErrors(); break;
case 0x07020002: throw PSERROR_Scripting_LoadFile_OpenFailed(); break;
case 0x07000001: throw PSERROR_Scripting_CallFunctionFailed(); break;
case 0x07000002: throw PSERROR_Scripting_ContextCreationFailed(); break;
case 0x07000003: throw PSERROR_Scripting_ConversionFailed(); break;
case 0x07000004: throw PSERROR_Scripting_CreateObjectFailed(); break;
case 0x07000005: throw PSERROR_Scripting_DefineConstantFailed(); break;
case 0x07000006: throw PSERROR_Scripting_GlobalObjectCreationFailed(); break;
case 0x07000007: throw PSERROR_Scripting_NativeFunctionSetupFailed(); break;
case 0x07000008: throw PSERROR_Scripting_RegisterFunctionFailed(); break;
case 0x07000009: throw PSERROR_Scripting_RuntimeCreationFailed(); break;
case 0x0700000a: throw PSERROR_Scripting_StandardClassSetupFailed(); break;
case 0x0700000b: throw PSERROR_Scripting_TypeDoesNotExist(); break;
case 0x08000001: throw PSERROR_System_RequiredExtensionsMissing(); break;
case 0x08000002: throw PSERROR_System_SDLInitFailed(); break;
case 0x08000003: throw PSERROR_System_VmodeFailed(); break;
case 0x09000001: throw PSERROR_Xeromyces_XMLOpenFailed(); break;
case 0x09000002: throw PSERROR_Xeromyces_XMLParseError(); break;
default: throw PSERROR_Error_InvalidError(); // Hmm...
}
}

View File

@ -1,6 +1,7 @@
del Coverage\*.dyn
Coverage\tests
cd Coverage
cd ..\..\..\binaries\system
..\..\source\i18n\tests\Coverage\tests
cd ..\..\source\i18n\tests\Coverage
profmerge
codecov -comp ../comp.txt -ccolor #f6f6ff -mname "Philip Taylor" -maddr excors@gmail.com
start CODE_COVERAGE.HTML

View File

@ -0,0 +1 @@
#include "precompiled.h"

View File

@ -24,12 +24,14 @@
#define SDL_BYTE_ORDER SDL_LIL_ENDIAN
#include <cassert>
#define cassert(x) extern char cassert__##__LINE__ [x]
#define debug_warn(x) assert(0&&x)
#define debug_assert assert
#define XP_WIN
#include "Errors.h"
#include "ps/Errors.h"
#include <stdio.h>
#define swprintf _snwprintf
#include <cstdio>
#define swprintf _snwprintf

63
source/i18n/tests/ps/Errors.cpp Executable file
View File

@ -0,0 +1,63 @@
// Auto-generated by errorlist.pl - do not edit.
#include "precompiled.h"
#include "Errors.h"
class PSERROR_Error : public PSERROR {};
class PSERROR_I18n : public PSERROR {};
class PSERROR_I18n_Script : public PSERROR_I18n {};
class PSERROR_Error_InvalidError : public PSERROR_Error { public: PSRETURN getCode() const; };
class PSERROR_I18n_Script_SetupFailed : public PSERROR_I18n_Script { public: PSRETURN getCode() const; };
extern const PSRETURN PSRETURN_Error_InvalidError = 0x01000001;
extern const PSRETURN PSRETURN_I18n_Script_SetupFailed = 0x02010001;
extern const PSRETURN MASK__PSRETURN_Error = 0xff000000;
extern const PSRETURN CODE__PSRETURN_Error = 0x01000000;
extern const PSRETURN MASK__PSRETURN_I18n = 0xff000000;
extern const PSRETURN CODE__PSRETURN_I18n = 0x02000000;
extern const PSRETURN MASK__PSRETURN_I18n_Script = 0xffff0000;
extern const PSRETURN CODE__PSRETURN_I18n_Script = 0x02010000;
extern const PSRETURN MASK__PSRETURN_Error_InvalidError = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_Error_InvalidError = 0x01000001;
extern const PSRETURN MASK__PSRETURN_I18n_Script_SetupFailed = 0xffffffff;
extern const PSRETURN CODE__PSRETURN_I18n_Script_SetupFailed = 0x02010001;
PSRETURN PSERROR_Error_InvalidError::getCode() const { return 0x01000001; }
PSRETURN PSERROR_I18n_Script_SetupFailed::getCode() const { return 0x02010001; }
const char* PSERROR::what() const throw ()
{
return GetErrorString(getCode());
}
const char* GetErrorString(const PSERROR& err)
{
return GetErrorString(err.getCode());
}
const char* GetErrorString(PSRETURN code)
{
switch (code)
{
case 0x01000001: return "Error_InvalidError";
case 0x02010001: return "I18n_Script_SetupFailed";
default: return "Unrecognised error";
}
}
void ThrowError(PSRETURN code)
{
switch (code) // Use 'break' in case someone tries to continue from the exception
{
case 0x01000001: throw PSERROR_Error_InvalidError(); break;
case 0x02010001: throw PSERROR_I18n_Script_SetupFailed(); break;
default: throw PSERROR_Error_InvalidError(); // Hmm...
}
}

View File

@ -1,16 +1,17 @@
#ifndef _ERRORS_H_
#define _ERRORS_H_
#include "types.h"
#include <exception>
#include "lib/types.h"
typedef u32 PSRETURN;
class PSERROR
class PSERROR : public std::exception
{
public:
int magic; // = 0x45725221, so the exception handler can recognise
// that it's a PSERROR and not some other random object.
PSRETURN code; // unique (but arbitrary) code, for translation tables etc
virtual const char* what() const throw ();
virtual PSRETURN getCode() const = 0; // for functions that catch exceptions then return error codes
};
#define ERROR_GROUP(a) class PSERROR_##a : public PSERROR {}; \
@ -22,7 +23,7 @@ public:
extern const PSRETURN CODE__PSRETURN_##a##_##b
#define ERROR_TYPE(a,b) class PSERROR_##a##_##b : public PSERROR_##a { public: PSERROR_##a##_##b(); }; \
#define ERROR_TYPE(a,b) class PSERROR_##a##_##b : public PSERROR_##a { public: PSRETURN getCode() const; }; \
extern const PSRETURN MASK__PSRETURN_##a##_##b; \
extern const PSRETURN CODE__PSRETURN_##a##_##b; \
extern const PSRETURN PSRETURN_##a##_##b
@ -33,7 +34,8 @@ const PSRETURN PSRETURN_OK = 0;
const PSRETURN MASK__PSRETURN_OK = 0xffffffff;
const PSRETURN CODE__PSRETURN_OK = 0;
const wchar_t* GetErrorString(PSRETURN code);
const char* GetErrorString(PSRETURN code);
const char* GetErrorString(const PSERROR& err);
void ThrowError(PSRETURN code);
#endif

View File

@ -0,0 +1,13 @@
#define XP_WIN
#include <jsapi.h>
#include <jsatom.h>
#ifndef NDEBUG
# include <jsdbgapi.h>
#endif
// Make JS debugging a little easier by automatically naming GC roots
// Don't simply #define NAME_ALL_GC_ROOTS, because jsapi.h is horridly broken
#ifndef NDEBUG
# define JS_AddRoot(cx, rp) JS_AddNamedRoot((cx), (rp), __FILE__ )
#endif

View File

@ -6,7 +6,7 @@
#include "Interface.h"
#include "jsapi.h"
#include "scripting/SpiderMonkey.h"
I18n::CLocale_interface* g_CurrentLocale;
#define translate(x) g_CurrentLocale->Translate(x)
@ -62,8 +62,8 @@ int main()
return 1;
extern void test();
test();
extern void test(JSContext*, JSObject*);
test(cx, glob);
#if 0
std::string lang = readfile("e:\\0ad\\cvs\\binaries\\data\\mods\\official\\language\\test\\phrases.lng");

View File

@ -1,8 +1,9 @@
#include "precompiled.h"
#include "Interface.h"
#include "scripting/SpiderMonkey.h"
#define FILE_PATH "..\\..\\..\\binaries\\data\\mods\\official\\language\\test\\"
#define FILE_PATH "..\\data\\mods\\official\\language\\test\\"
extern I18n::CLocale_interface* g_CurrentLocale;
#define translate(x) g_CurrentLocale->Translate(x)
@ -31,12 +32,13 @@ void test_assert(bool test, const char* file, int line, const char* fmt, ...)
{
if (! test)
{
char msg[256];
char msg[512];
va_list v;
va_start(v, fmt);
vsprintf(msg, fmt, v);
char err[256];
sprintf(err, "%s(%d) : TEST FAILED : %s\n", file, line, msg);
_vsnprintf(msg, sizeof(msg), fmt, v);
char err[512];
_snprintf(err, sizeof(err), "%s(%d) : TEST FAILED : %s\n", file, line, msg);
err[sizeof(err)-1] = 0;
OutputDebugStringA(err);
printf("%s", err);
}
@ -61,7 +63,19 @@ namespace I18n { extern bool g_UsedCache; }
test_assert(I18n::g_UsedCache, __FILE__, __LINE__, "Failed to use cache"); \
}
void test()
#define TEST_EQ_SCRIPT(answer, str) \
{ \
jsval rval; \
if (JS_EvaluateScript(cx, glob, str, (int)strlen(str), "test", 1, &rval) != JS_TRUE) \
test_assert(false, __FILE__, __LINE__, "Script eval failed"); \
else { \
JSString* r = JS_ValueToString(cx, rval); \
I18n::Str s (JS_GetStringChars(r), JS_GetStringLength(r)); \
test_assert(s == L##answer, __FILE__, __LINE__, "Unexpected output:\n '%ls'\nExpected:\n '%ls'", s.c_str(), L##answer); \
} \
}
void test(JSContext* cx, JSObject* glob)
{
// Untranslated strings. Simple strings.
TEST_EQ_NOCACHE(
@ -223,7 +237,45 @@ void test()
"Testing things $num of $object", << -3.5 << I18n::Raw("orangutan")
);
// TODO: Tests for the JS interface.
// Repeated tests, using JS interface.
TEST_EQ_SCRIPT(
"Hello world banana",
"translate('Hello world $n', i18n.Name('banana'))"
);
TEST_EQ_SCRIPT(
"Hello world banana",
"translate('Hello world $n', i18n.Raw('banana'))"
);
TEST_EQ_SCRIPT(
"Hello world BANANA",
"translate('Hello world $n', i18n.Noun('banana'))"
);
TEST_EQ_SCRIPT(
"1.2345+67890=67891.2345. An armadillo buys a platypus for 14.99 (platypus! 14.990000!)",
"translate('Test $obj ($$$amnt)', i18n.Noun('platypus'), 14.99)"
);
TEST_EQ_SCRIPT(
"There are (1 BANANA) here",
"translate('Testing things $num of $object', 1, i18n.Noun('banana'))"
);
TEST_EQ_SCRIPT(
"There are (2 bananas) here",
"translate('Testing things $num of $object', 2, i18n.Noun('banana'))"
);
TEST_EQ_SCRIPT(
"There are (2.5 bananas) here",
"translate('Testing things $num of $object', 2.5, i18n.Raw('banana'))"
);
TEST_EQ_SCRIPT(
"There are (-3.5 orangutan) here",
"translate('Testing things $num of $object', -3.5, i18n.Raw('orangutan'))"
);
}

View File

@ -1,327 +1,262 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Intel C++ Project"
Version="7.1"
Version="9.0"
Name="tests"
ProjectGUID="{B48BE4CA-40AF-4D48-86CC-7FCA6BDD02BF}"
VCNestedProjectGUID="{1D6A376C-DA9E-4E03-83A7-16784F356633}"
VCNestedProjectFileName="tests.vcproj">
VCNestedProjectFileName="tests.vcproj"
Keyword="Win32Proj">
<Configurations>
<Configuration
Name="Debug|Win32">
<IntelOptions
<Tool
Name="GeneralTool"
OutputDirectory="Debug"
IntermediateDirectory="Debug"
ConfigurationType="1"
CharacterSet="2"
CompilerName="1"/>
<Tool
Name="VCCLCompilerTool">
<IntelOptions
Optimization="0"
MinimalRebuild="1"
BasicRuntimeChecks="3"
RuntimeLibrary="5"/>
</Tool>
Name="DebugTool"
WorkingDirectory="e:\0ad\svnc\trunk\binaries\system"/>
<Tool
Name="CppCmplrTool"
Optimization="0"
AdditionalIncludeDirectories=".;..;..\..\..\libraries\spidermonkey\include"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;I18NDEBUG"
MinimalRebuild="1"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
UsePrecompiledHeader="3"
PrecompiledHeaderThrough="precompiled.h"
WarningLevel="3"
Detect64BitPortabilityProblems="1"
DebugInformationFormat="4"/>
<Tool
Name="LinkerTool"
DelayImpLib=""
AdditionalDependencies="kernel32.lib js32d.lib"
OutputFile="$(OutDir)/tests.exe"
LinkIncremental="2"
AdditionalLibraryDirectories="E:\0ad\libs\lib"
GenerateDebugInformation="1"
ProgramDatabaseFile="$(OutDir)/tests.pdb"
SubSystem="1"
TargetMachine="1"/>
<Tool
Name="LibrarianTool"/>
<Tool
Name="ResCmplrTool"/>
<Tool
Name="MidlCmplrTool"/>
<Tool
Name="BscMakeTool"/>
<Tool
Name="PreBuildEventTool"/>
<Tool
Name="PreLinkEventTool"/>
<Tool
Name="PostBuildEventTool"/>
<Tool
Name="CustomTool"/>
<Tool
Name="CustomNodeTool"/>
</Configuration>
<Configuration
Name="Release|Win32">
<IntelOptions
<Tool
Name="GeneralTool"
OutputDirectory="Release"
IntermediateDirectory="Release"
ConfigurationType="1"
CharacterSet="2"
CompilerName="1"/>
<Tool
Name="VCCLCompilerTool">
<IntelOptions
RuntimeLibrary="4"/>
</Tool>
Name="DebugTool"
WorkingDirectory="e:\0ad\svnc\trunk\binaries\system"/>
<Tool
Name="CppCmplrTool"
AdditionalIncludeDirectories=".;..;..\..\..\libraries\spidermonkey\include"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="4"
UsePrecompiledHeader="3"
PrecompiledHeaderThrough="precompiled.h"
WarningLevel="3"
Detect64BitPortabilityProblems="1"
DebugInformationFormat="3"/>
<Tool
Name="LinkerTool"
DelayImpLib=""
AdditionalDependencies="kernel32.lib js32.lib"
OutputFile="$(OutDir)/tests.exe"
LinkIncremental="1"
AdditionalLibraryDirectories="E:\0ad\libs\lib"
GenerateDebugInformation="1"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"/>
<Tool
Name="LibrarianTool"/>
<Tool
Name="ResCmplrTool"/>
<Tool
Name="MidlCmplrTool"/>
<Tool
Name="BscMakeTool"/>
<Tool
Name="PreBuildEventTool"/>
<Tool
Name="PreLinkEventTool"/>
<Tool
Name="PostBuildEventTool"/>
<Tool
Name="CustomTool"/>
<Tool
Name="CustomNodeTool"/>
</Configuration>
<Configuration
Name="Coverage|Win32">
<Tool
Name="VCCLCompilerTool">
<IntelOptions
PGOPhase="2"
Optimization="0"
MinimalRebuild="1"
BasicRuntimeChecks="0"
RuntimeLibrary="5"/>
</Tool>
Name="GeneralTool"
OutputDirectory="Coverage"
IntermediateDirectory="Coverage"
ConfigurationType="1"
CharacterSet="2"
PGOPhase="2"/>
<Tool
Name="DebugTool"
WorkingDirectory="e:\0ad\svnc\trunk\binaries\system"/>
<Tool
Name="CppCmplrTool"
Optimization="0"
AdditionalIncludeDirectories=".;..;..\..\..\libraries\spidermonkey\include"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;I18NDEBUG"
MinimalRebuild="1"
BasicRuntimeChecks="0"
RuntimeLibrary="5"
UsePrecompiledHeader="3"
PrecompiledHeaderThrough="precompiled.h"
WarningLevel="3"
Detect64BitPortabilityProblems="1"
DebugInformationFormat="3"/>
<Tool
Name="LinkerTool"
DelayImpLib=""
AdditionalDependencies="kernel32.lib js32d.lib"
OutputFile="$(OutDir)/tests.exe"
LinkIncremental="2"
SuppressStartupBanner="1"
AdditionalLibraryDirectories="E:\0ad\libs\lib"
GenerateDebugInformation="1"
ProgramDatabaseFile="$(OutDir)/tests.pdb"
SubSystem="1"
TargetMachine="1"/>
<Tool
Name="LibrarianTool"/>
<Tool
Name="ResCmplrTool"/>
<Tool
Name="MidlCmplrTool"/>
<Tool
Name="BscMakeTool"/>
<Tool
Name="PreBuildEventTool"/>
<Tool
Name="PreLinkEventTool"/>
<Tool
Name="PostBuildEventTool"/>
<Tool
Name="CustomTool"/>
<Tool
Name="CustomNodeTool"/>
</Configuration>
</Configurations>
<Files>
<File
RelativePath=".\CStr.cpp">
RelativePath=".\CStr.h"/>
<File
RelativePath=".\precompiled.cpp">
<FileConfiguration
Name="Debug|Win32"/>
Name="Coverage|Win32">
<Tool
Name="CppCmplrTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"/>
Name="Debug|Win32">
<Tool
Name="CppCmplrTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
<FileConfiguration
Name="Coverage|Win32"/>
Name="Release|Win32">
<Tool
Name="CppCmplrTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
</File>
<File
RelativePath=".\CStr.h">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath=".\precompiled.h"/>
<File
RelativePath=".\Errors.cpp">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath=".\StringConvert.cpp"/>
<File
RelativePath=".\Errors.h">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath=".\StringConvert.h"/>
<File
RelativePath=".\precompiled.h">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath=".\test.cpp"/>
<File
RelativePath=".\StringConvert.cpp">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath=".\tests.cpp"/>
<File
RelativePath=".\StringConvert.h">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath=".\UniDoubler.h"/>
<File
RelativePath=".\test.cpp">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath=".\utf16string.h"/>
<File
RelativePath=".\tests.cpp">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath="..\BufferVariable.cpp"/>
<File
RelativePath=".\types.h">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath="..\BufferVariable.h"/>
<File
RelativePath=".\UniDoubler.h">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath="..\CLocale.cpp"/>
<File
RelativePath=".\utf16string.h">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath="..\CLocale.h"/>
<File
RelativePath="..\BufferVariable.cpp">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath="..\Common.h"/>
<File
RelativePath="..\BufferVariable.h">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath="..\DataTypes.h"/>
<File
RelativePath="..\CLocale.cpp">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath="..\Interface.cpp"/>
<File
RelativePath="..\CLocale.h">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath="..\Interface.h"/>
<File
RelativePath="..\Common.h">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath="..\ScriptInterface.cpp"/>
<File
RelativePath="..\DataTypes.h">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath="..\ScriptInterface.h"/>
<File
RelativePath="..\Interface.cpp">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath="..\StrImmutable.h"/>
<File
RelativePath="..\Interface.h">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath="..\StringBuffer.cpp"/>
<File
RelativePath="..\ScriptInterface.cpp">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath="..\StringBuffer.h"/>
<File
RelativePath="..\ScriptInterface.h">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath="..\TranslatedString.cpp"/>
<File
RelativePath="..\StrImmutable.h">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath="..\TranslatedString.h"/>
<File
RelativePath="..\StringBuffer.cpp">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath="..\TSComponent.cpp"/>
<File
RelativePath="..\StringBuffer.h">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath="..\TSComponent.h"/>
<File
RelativePath="..\TranslatedString.cpp">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath=".\lib\types.h"/>
<File
RelativePath="..\TranslatedString.h">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath=".\lib\sysdep\sysdep.h"/>
<File
RelativePath="..\TSComponent.cpp">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath=".\ps\CLogger.h"/>
<File
RelativePath="..\TSComponent.h">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath=".\ps\Errors.cpp"/>
<File
RelativePath=".\lib\sysdep\sysdep.h">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath=".\ps\Errors.h"/>
<File
RelativePath=".\ps\CLogger.h">
<FileConfiguration
Name="Debug|Win32"/>
<FileConfiguration
Name="Release|Win32"/>
<FileConfiguration
Name="Coverage|Win32"/>
</File>
RelativePath=".\scripting\SpiderMonkey.h"/>
</Files>
</VisualStudioProject>

View File

@ -20,12 +20,13 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="E:\0ad\libs\include;E:\0ad\cvs\source\i18n;E:\0ad\cvs\source\i18n\tests"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
AdditionalIncludeDirectories=".;..;..\..\..\libraries\spidermonkey\include"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;I18NDEBUG"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
UsePrecompiledHeader="0"
UsePrecompiledHeader="3"
PrecompiledHeaderThrough="precompiled.h"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4"/>
@ -70,10 +71,11 @@
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="E:\0ad\libs\include;E:\0ad\cvs\source\i18n;E:\0ad\cvs\source\i18n\tests"
AdditionalIncludeDirectories=".;..;..\..\..\libraries\spidermonkey\include"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="4"
UsePrecompiledHeader="0"
UsePrecompiledHeader="3"
PrecompiledHeaderThrough="precompiled.h"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"/>
@ -113,19 +115,20 @@
</Configuration>
<Configuration
Name="Coverage|Win32"
OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
OutputDirectory="Coverage"
IntermediateDirectory="Coverage"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="E:\0ad\libs\include;E:\0ad\cvs\source\i18n;E:\0ad\cvs\source\i18n\tests"
AdditionalIncludeDirectories=".;..;..\..\..\libraries\spidermonkey\include"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;I18NDEBUG"
MinimalRebuild="TRUE"
BasicRuntimeChecks="0"
RuntimeLibrary="5"
UsePrecompiledHeader="0"
UsePrecompiledHeader="3"
PrecompiledHeaderThrough="precompiled.h"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"/>
@ -171,17 +174,29 @@
Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
<File
RelativePath=".\CStr.cpp">
</File>
<File
RelativePath=".\CStr.h">
</File>
<File
RelativePath=".\Errors.cpp">
</File>
<File
RelativePath=".\Errors.h">
RelativePath=".\precompiled.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
<FileConfiguration
Name="Coverage|Win32">
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
</File>
<File
RelativePath=".\precompiled.h">
@ -198,9 +213,6 @@
<File
RelativePath=".\tests.cpp">
</File>
<File
RelativePath=".\types.h">
</File>
<File
RelativePath=".\UniDoubler.h">
</File>
@ -265,6 +277,9 @@
<Filter
Name="lib"
Filter="">
<File
RelativePath=".\lib\types.h">
</File>
<Filter
Name="sysdep"
Filter="">
@ -279,6 +294,37 @@
<File
RelativePath=".\ps\CLogger.h">
</File>
<File
RelativePath=".\ps\Errors.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)/$(InputName)1.obj"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)/$(InputName)1.obj"/>
</FileConfiguration>
<FileConfiguration
Name="Coverage|Win32">
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)/$(InputName)1.obj"/>
</FileConfiguration>
</File>
<File
RelativePath=".\ps\Errors.h">
</File>
</Filter>
<Filter
Name="scripting"
Filter="">
<File
RelativePath=".\scripting\SpiderMonkey.h">
</File>
</Filter>
</Filter>
<Filter