bool Test()
{
	bool fail = false;
	int r = 0;
	COutStream out;

	// TODO: Preprocessor directives should be alone on the line

	asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION);
	RegisterScriptArray(engine, true);

	engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL);
	RegisterScriptMathComplex(engine);

	// Test the parse token method
	asETokenClass t = engine->ParseToken("!is");
	if( t != asTC_KEYWORD )
		TEST_FAILED;

	// Compile a script with meta data strings
	CScriptBuilder builder;
	builder.DefineWord("COMPILE");
	r = builder.StartNewModule(engine, 0);
	r = builder.AddSectionFromMemory(script);
	r = builder.BuildModule();
#if AS_PROCESS_METADATA == 1
	if( r < 0 )
		TEST_FAILED;

	int funcId = engine->GetModule(0)->GetFunctionIdByName("func1");
	string metadata = builder.GetMetadataStringForFunc(funcId);
	if( metadata != " my meta data test " )
		TEST_FAILED;

	funcId = engine->GetModule(0)->GetFunctionIdByName("func2");
	metadata = builder.GetMetadataStringForFunc(funcId);
	if( metadata != " test['hello'] " )
		TEST_FAILED;

	int typeId = engine->GetModule(0)->GetTypeIdByDecl("MyClass");
	metadata = builder.GetMetadataStringForType(typeId);
	if( metadata != " myclass " )
		TEST_FAILED;

	typeId = engine->GetModule(0)->GetTypeIdByDecl("MyClass2");
	metadata = builder.GetMetadataStringForTypeProperty(typeId, 0);
	if( metadata != " edit " )
		TEST_FAILED;
	metadata = builder.GetMetadataStringForTypeProperty(typeId, 1);
	if( metadata != " noedit " )
		TEST_FAILED;
	metadata = builder.GetMetadataStringForTypeProperty(typeId, 2);
	if( metadata != " edit,c " )
		TEST_FAILED;

	typeId = engine->GetModule(0)->GetTypeIdByDecl("MyIntf");
	metadata = builder.GetMetadataStringForType(typeId);
	if( metadata != " myintf " )
		TEST_FAILED;

	int varIdx = engine->GetModule(0)->GetGlobalVarIndexByName("g_var");
	metadata = builder.GetMetadataStringForVar(varIdx);
	if( metadata != " init " )
		TEST_FAILED;

	varIdx = engine->GetModule(0)->GetGlobalVarIndexByName("g_obj");
	metadata = builder.GetMetadataStringForVar(varIdx);
	if( metadata != " var of type myclass " )
		TEST_FAILED;
#endif

	engine->Release();

	return fail;
}
Exemple #2
0
bool Test()
{
	bool fail = false;
	int r = 0;
	COutStream out;
	CBufferedOutStream bout;

	// TODO: Preprocessor directives should be alone on the line

	asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION);
	RegisterScriptArray(engine, true);

	engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL);
	if( !strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY") )
		RegisterScriptMathComplex(engine);
	else
		engine->RegisterObjectType("complex", 4, asOBJ_VALUE | asOBJ_POD);

	// Test the parse token method
	asETokenClass t = engine->ParseToken("!is");
	if( t != asTC_KEYWORD )
		TEST_FAILED;

	// Compile a script with meta data strings
	CScriptBuilder builder;
	builder.DefineWord("COMPILE");
	r = builder.StartNewModule(engine, 0);
	r = builder.AddSectionFromMemory("", script);
	r = builder.BuildModule();
#if AS_PROCESS_METADATA == 1
	if( r < 0 )
		TEST_FAILED;

	asIScriptFunction *func = engine->GetModule(0)->GetFunctionByName("func1");
	string metadata = builder.GetMetadataStringForFunc(func);
	if( metadata != " my meta data test " )
		TEST_FAILED;

	func = engine->GetModule(0)->GetFunctionByName("func2");
	metadata = builder.GetMetadataStringForFunc(func);
	if( metadata != " test['hello'] " )
		TEST_FAILED;

	engine->GetModule(0)->SetDefaultNamespace("NS");
	func = engine->GetModule(0)->GetFunctionByName("func");
	metadata = builder.GetMetadataStringForFunc(func);
	if( metadata != "func" )
		TEST_FAILED;
	engine->GetModule(0)->SetDefaultNamespace("");

	int typeId = engine->GetModule(0)->GetTypeIdByDecl("MyClass");
	metadata = builder.GetMetadataStringForType(typeId);
	if( metadata != " myclass " )
		TEST_FAILED;

	typeId = engine->GetModule(0)->GetTypeIdByDecl("NS::Class");
	metadata = builder.GetMetadataStringForType(typeId);
	if( metadata != "class" )
		TEST_FAILED;

	typeId = engine->GetModule(0)->GetTypeIdByDecl("MyClass2");
	metadata = builder.GetMetadataStringForTypeProperty(typeId, 0);
	if( metadata != " edit " )
		TEST_FAILED;
	metadata = builder.GetMetadataStringForTypeProperty(typeId, 1);
	if( metadata != " noedit " )
		TEST_FAILED;
	metadata = builder.GetMetadataStringForTypeProperty(typeId, 2);
	if( metadata != " edit,c " )
		TEST_FAILED;

	asIObjectType *type = engine->GetObjectTypeById(typeId);
	if( type == 0 )
		TEST_FAILED;
	else
	{
		metadata = builder.GetMetadataStringForTypeMethod(typeId, type->GetMethodByName("get_prop"));
		if( metadata != " prop " )
			TEST_FAILED;
		metadata = builder.GetMetadataStringForTypeMethod(typeId, type->GetMethodByName("set_prop"));
		if( metadata != " prop " )
			TEST_FAILED;
	}

	typeId = engine->GetModule(0)->GetTypeIdByDecl("MyIntf");
	metadata = builder.GetMetadataStringForType(typeId);
	if( metadata != " myintf " )
		TEST_FAILED;

	int varIdx = engine->GetModule(0)->GetGlobalVarIndexByName("g_var");
	metadata = builder.GetMetadataStringForVar(varIdx);
	if( metadata != " init " )
		TEST_FAILED;

	varIdx = engine->GetModule(0)->GetGlobalVarIndexByName("g_obj");
	metadata = builder.GetMetadataStringForVar(varIdx);
	if( metadata != " var of type myclass " )
		TEST_FAILED;
#endif

	// http://www.gamedev.net/topic/624445-cscriptbuilder-asset-string-subscript-out-of-range/
	{
		bout.buffer = "";
		CScriptBuilder builder;
		builder.StartNewModule(engine, "mod");
		builder.AddSectionFromMemory("", "#");
		engine->SetMessageCallback(asMETHOD(CBufferedOutStream, Callback), &bout, asCALL_THISCALL);
		r = builder.BuildModule();
		if( r >= 0 )
			TEST_FAILED;
		if( bout.buffer != " (1, 1) : Error   : Unexpected token '<unrecognized token>'\n" )
		{
			printf("%s", bout.buffer.c_str());
			TEST_FAILED;
		}
	}

	// Add a script section from memory with length
	{
		engine->SetMessageCallback(asMETHOD(COutStream, Callback), &bout, asCALL_THISCALL);
		CScriptBuilder builder;
		builder.StartNewModule(engine, "mod");
		builder.AddSectionFromMemory("", "void func() {} $#", 14);
		r = builder.BuildModule();
		if( r < 0 )
			TEST_FAILED;
	}

	// http://www.gamedev.net/topic/631848-cscriptbuilder-bug/
	{
		bout.buffer = "";
		CScriptBuilder builder;
		builder.StartNewModule(engine, "mod");
		builder.AddSectionFromMemory("", "class ");
		engine->SetMessageCallback(asMETHOD(CBufferedOutStream, Callback), &bout, asCALL_THISCALL);
		r = builder.BuildModule();
		if( r >= 0 )
			TEST_FAILED;
		if( bout.buffer != " (1, 7) : Error   : Expected identifier\n"
		                   " (1, 7) : Error   : Instead found '<end of file>'\n"
						   " (1, 7) : Error   : Expected '{'\n"
						   " (1, 7) : Error   : Instead found '<end of file>'\n" )
		{
			printf("%s", bout.buffer.c_str());
			TEST_FAILED;
		}
	}

	engine->Release();

	return fail;
}