<?xml version="1.0" encoding="utf-8"?>
<!--

  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

-->
<UnitTester testDir="CompiletimeLocalization/atresourceimplementation/"  xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" testSWF="CTL_atResource_en.mxml">
	<!-- this set of lines form a template that must be in each unit test -->
	<mx:Script>
	<![CDATA[
	public static function init(o:DisplayObject):void
	{
	}					
	]]>
	</mx:Script>
	<mx:Metadata>
	<![CDATA[
		[Mixin]
	]]>
	</mx:Metadata>	
	<!-- end of set of lines that must be in each unit test -->
	<mx:Script>
	<![CDATA[
	import mx.resources.*;
	import mx.controls.*;
	import mx.resources.ResourceManager;
	import mx.managers.SystemManager;
	public function scriptFunction(a:String, b:int):String
	{
		return a + ":" + b.toString();
	}
	public var styleDecl:Object;
	public var styleObj:Object;
	public function setCountry():void{
		//application.myLabel.text=@Resource(bundle='MyResources', key='MyResources_label');
		//application.myLabel.text="I am from Resources Properties File"
	}
	]]>
	</mx:Script>
	<testCases>
	<TestCase testID="Checking_the_atResourceImplementation_of_a_string" keywords="[CompileTime,Localization,atResourceImplementation]" description="Checking the atResourceImplementation of a string">
		<setup>
			<RunCode code="setCountry()"/>
		</setup>
		<body>
			<AssertPropertyValue target="myLabel" propertyName="text" value="I am from Resources Properties File" />
		</body>
	</TestCase>
	<TestCase testID="Checking_the_atResourceImplementation_of_a_boolean" keywords="[CompileTime,Localization,atResourceImplementation]" description="Checking the atResourceImplementation of a boolean">
		<setup>
			<RunCode code="setCountry()"/>
		</setup>
		<body>
			<AssertPropertyValue target="myCheckBox" propertyName="selected" value="true" />
		</body>
	</TestCase>
</testCases>
</UnitTester>
