You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

520 lines
22 KiB

7 years ago
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using DentedPixel;
  5. namespace DentedPixel.LTExamples{
  6. public class TestingUnitTests : MonoBehaviour {
  7. public GameObject cube1;
  8. public GameObject cube2;
  9. public GameObject cube3;
  10. public GameObject cube4;
  11. public GameObject cubeAlpha1;
  12. public GameObject cubeAlpha2;
  13. private bool eventGameObjectWasCalled = false, eventGeneralWasCalled = false;
  14. private int lt1Id;
  15. private LTDescr lt2;
  16. private LTDescr lt3;
  17. private LTDescr lt4;
  18. private LTDescr[] groupTweens;
  19. private GameObject[] groupGOs;
  20. private int groupTweensCnt;
  21. private int rotateRepeat;
  22. private int rotateRepeatAngle;
  23. private GameObject boxNoCollider;
  24. private float timeElapsedNormalTimeScale;
  25. private float timeElapsedIgnoreTimeScale;
  26. void Awake(){
  27. boxNoCollider = GameObject.CreatePrimitive(PrimitiveType.Cube);
  28. Destroy( boxNoCollider.GetComponent( typeof(BoxCollider) ) as Component );
  29. }
  30. void Start () {
  31. // Time.timeScale = 0.25f;
  32. LeanTest.timeout = 46f;
  33. LeanTest.expected = 56;
  34. LeanTween.init(15 + 1200);
  35. // add a listener
  36. LeanTween.addListener(cube1, 0, eventGameObjectCalled);
  37. LeanTest.expect(LeanTween.isTweening() == false, "NOTHING TWEEENING AT BEGINNING" );
  38. LeanTest.expect(LeanTween.isTweening(cube1) == false, "OBJECT NOT TWEEENING AT BEGINNING" );
  39. LeanTween.scaleX( cube4, 2f, 0f).setOnComplete( ()=>{
  40. LeanTest.expect( cube4.transform.localScale.x == 2f, "TWEENED WITH ZERO TIME" );
  41. });
  42. // dispatch event that is received
  43. LeanTween.dispatchEvent(0);
  44. LeanTest.expect( eventGameObjectWasCalled, "EVENT GAMEOBJECT RECEIVED" );
  45. // do not remove listener
  46. LeanTest.expect(LeanTween.removeListener(cube2, 0, eventGameObjectCalled)==false, "EVENT GAMEOBJECT NOT REMOVED" );
  47. // remove listener
  48. LeanTest.expect(LeanTween.removeListener(cube1, 0, eventGameObjectCalled), "EVENT GAMEOBJECT REMOVED" );
  49. // add a listener
  50. LeanTween.addListener(1, eventGeneralCalled);
  51. // dispatch event that is received
  52. LeanTween.dispatchEvent(1);
  53. LeanTest.expect( eventGeneralWasCalled, "EVENT ALL RECEIVED" );
  54. // remove listener
  55. LeanTest.expect( LeanTween.removeListener( 1, eventGeneralCalled), "EVENT ALL REMOVED" );
  56. lt1Id = LeanTween.move( cube1, new Vector3(3f,2f,0.5f), 1.1f ).id;
  57. LeanTween.move( cube2, new Vector3(-3f,-2f,-0.5f), 1.1f );
  58. LeanTween.reset();
  59. // Queue up a bunch of tweens, cancel some of them but expect the remainder to finish
  60. GameObject[] cubes = new GameObject[99];
  61. int[] tweenIds = new int[cubes.Length];
  62. for (int i = 0; i < cubes.Length; i++) {
  63. GameObject c = cubeNamed("cancel"+i);
  64. tweenIds[i] = LeanTween.moveX (c, 100f, 1f).id;
  65. cubes [i] = c;
  66. }
  67. int onCompleteCount = 0;
  68. LeanTween.delayedCall (cubes[0], 0.2f, () => {
  69. for (int i = 0; i < cubes.Length; i++) {
  70. if(i%3==0){
  71. LeanTween.cancel( cubes [i] );
  72. }else if(i%3==1){
  73. LeanTween.cancel( tweenIds[i] );
  74. }else if(i%3==2){
  75. LTDescr descr = LeanTween.descr(tweenIds[i]);
  76. // Debug.Log("descr:"+descr);
  77. descr.setOnComplete( ()=>{
  78. onCompleteCount++;
  79. // Debug.Log("onCompleteCount:"+onCompleteCount);
  80. if(onCompleteCount>=33){
  81. LeanTest.expect(true, "CANCELS DO NOT EFFECT FINISHING" );
  82. }
  83. });
  84. }
  85. }
  86. });
  87. Vector3[] splineArr = new Vector3[] {new Vector3(-1f,0f,0f), new Vector3(0f,0f,0f), new Vector3(4f,0f,0f), new Vector3(20f,0f,0f), new Vector3(30f,0f,0f)};
  88. LTSpline cr = new LTSpline( splineArr );
  89. cr.place( cube4.transform, 0.5f );
  90. LeanTest.expect( (Vector3.Distance( cube4.transform.position, new Vector3(10f,0f,0f) ) <= 0.7f), "SPLINE POSITIONING AT HALFWAY", "position is:"+cube4.transform.position+" but should be:(10f,0f,0f)");
  91. LeanTween.color(cube4, Color.green, 0.01f);
  92. // Debug.Log("Point 2:"+cr.ratioAtPoint(splineArr[2]));
  93. // OnStart Speed Test for ignoreTimeScale vs normal timeScale
  94. GameObject cubeDest = cubeNamed("cubeDest");
  95. Vector3 cubeDestEnd = new Vector3(100f,20f,0f);
  96. LeanTween.move( cubeDest, cubeDestEnd, 0.7f);
  97. GameObject cubeToTrans = cubeNamed("cubeToTrans");
  98. LeanTween.move( cubeToTrans, cubeDest.transform, 1.2f).setEase( LeanTweenType.easeOutQuad ).setOnComplete( ()=>{
  99. LeanTest.expect( cubeToTrans.transform.position == cubeDestEnd, "MOVE TO TRANSFORM WORKS");
  100. });
  101. GameObject cubeDestroy = cubeNamed("cubeDestroy");
  102. LeanTween.moveX( cubeDestroy, 200f, 0.05f).setDelay(0.02f).setDestroyOnComplete(true);
  103. LeanTween.moveX( cubeDestroy, 200f, 0.1f).setDestroyOnComplete(true).setOnComplete( ()=>{
  104. LeanTest.expect(true, "TWO DESTROY ON COMPLETE'S SUCCEED");
  105. });
  106. GameObject cubeSpline = cubeNamed("cubeSpline");
  107. LeanTween.moveSpline(cubeSpline, new Vector3[]{new Vector3(0.5f,0f,0.5f),new Vector3(0.75f,0f,0.75f),new Vector3(1f,0f,1f),new Vector3(1f,0f,1f)}, 0.1f).setOnComplete( ()=>{
  108. LeanTest.expect(Vector3.Distance(new Vector3(1f,0f,1f), cubeSpline.transform.position) < 0.01f, "SPLINE WITH TWO POINTS SUCCEEDS");
  109. });
  110. // This test works when it is positioned last in the test queue (probably worth fixing when you have time)
  111. GameObject jumpCube = cubeNamed("jumpTime");
  112. jumpCube.transform.position = new Vector3(100f,0f,0f);
  113. jumpCube.transform.localScale *= 100f;
  114. int jumpTimeId = LeanTween.moveX( jumpCube, 200f, 1f).id;
  115. LeanTween.delayedCall(gameObject, 0.2f, ()=>{
  116. LTDescr d = LeanTween.descr( jumpTimeId );
  117. float beforeX = jumpCube.transform.position.x;
  118. d.setTime( 0.5f );
  119. LeanTween.delayedCall( 0.0f, ()=>{ }).setOnStart( ()=>{
  120. float diffAmt = 1f;// This variable is dependent on a good frame-rate because it evalutes at the next Update
  121. beforeX += Time.deltaTime * 100f * 2f;
  122. LeanTest.expect( Mathf.Abs( jumpCube.transform.position.x - beforeX ) < diffAmt , "CHANGING TIME DOESN'T JUMP AHEAD", "Difference:"+Mathf.Abs( jumpCube.transform.position.x - beforeX ) +" beforeX:"+beforeX+" now:"+jumpCube.transform.position.x+" dt:"+Time.deltaTime);
  123. });
  124. });
  125. // Tween with time of zero is needs to be set to it's final value
  126. GameObject zeroCube = cubeNamed("zeroCube");
  127. LeanTween.moveX( zeroCube, 10f, 0f).setOnComplete( ()=>{
  128. LeanTest.expect( zeroCube.transform.position.x == 10f, "ZERO TIME FINSHES CORRECTLY", "final x:"+ zeroCube.transform.position.x);
  129. });
  130. // Scale, and OnStart
  131. GameObject cubeScale = cubeNamed("cubeScale");
  132. LeanTween.scale(cubeScale, new Vector3(5f,5f,5f),0.01f).setOnStart(()=>{
  133. LeanTest.expect( true, "ON START WAS CALLED");
  134. }).setOnComplete(()=>{
  135. LeanTest.expect( cubeScale.transform.localScale.z == 5f, "SCALE","expected scale z:"+5f+" returned:"+cubeScale.transform.localScale.z);
  136. });
  137. // Rotate
  138. GameObject cubeRotate = cubeNamed("cubeRotate");
  139. LeanTween.rotate(cubeRotate, new Vector3(0f,180f,0f),0.02f).setOnComplete(()=>{
  140. LeanTest.expect( cubeRotate.transform.eulerAngles.y == 180f, "ROTATE","expected rotate y:"+180f+" returned:"+cubeRotate.transform.eulerAngles.y);
  141. });
  142. // RotateAround
  143. GameObject cubeRotateA = cubeNamed("cubeRotateA");
  144. LeanTween.rotateAround(cubeRotateA,Vector3.forward,90f,0.3f).setOnComplete(()=>{
  145. LeanTest.expect( cubeRotateA.transform.eulerAngles.z==90f, "ROTATE AROUND","expected rotate z:"+90f+" returned:"+cubeRotateA.transform.eulerAngles.z);
  146. });
  147. // RotateAround 360
  148. GameObject cubeRotateB = cubeNamed("cubeRotateB");
  149. cubeRotateB.transform.position = new Vector3(200f,10f,8f);
  150. LeanTween.rotateAround(cubeRotateB,Vector3.forward,360f,0.3f).setPoint(new Vector3(5f,3f,2f)).setOnComplete(()=>{
  151. LeanTest.expect( cubeRotateB.transform.position.ToString()==(new Vector3(200f,10f,8f)).ToString(), "ROTATE AROUND 360","expected rotate pos:"+(new Vector3(200f,10f,8f))+" returned:"+cubeRotateB.transform.position);
  152. });
  153. // Alpha, onUpdate with passing value, onComplete value
  154. LeanTween.alpha(cubeAlpha1,0.5f,0.1f).setOnUpdate( (float val)=>{
  155. LeanTest.expect(val!=0f ,"ON UPDATE VAL");
  156. }).setOnCompleteParam( "Hi!" ).setOnComplete( (object completeObj)=>{
  157. LeanTest.expect(((string)completeObj)=="Hi!","ONCOMPLETE OBJECT");
  158. LeanTest.expect(cubeAlpha1.GetComponent<Renderer>().material.color.a == 0.5f,"ALPHA");
  159. });
  160. // Color
  161. float onStartTime = -1f;
  162. LeanTween.color(cubeAlpha2, Color.cyan, 0.3f).setOnComplete( ()=>{
  163. LeanTest.expect(cubeAlpha2.GetComponent<Renderer>().material.color==Color.cyan, "COLOR");
  164. LeanTest.expect(onStartTime>=0f && onStartTime<Time.time, "ON START","onStartTime:"+onStartTime+" time:"+Time.time);
  165. }).setOnStart(()=>{
  166. onStartTime = Time.time;
  167. });
  168. // moveLocalY (make sure uses y values)
  169. Vector3 beforePos = cubeAlpha1.transform.position;
  170. LeanTween.moveY(cubeAlpha1, 3f, 0.2f).setOnComplete( ()=>{
  171. LeanTest.expect(cubeAlpha1.transform.position.x==beforePos.x && cubeAlpha1.transform.position.z==beforePos.z,"MOVE Y");
  172. });
  173. Vector3 beforePos2 = cubeAlpha2.transform.localPosition;
  174. LeanTween.moveLocalZ(cubeAlpha2, 12f, 0.2f).setOnComplete( ()=>{
  175. LeanTest.expect(cubeAlpha2.transform.localPosition.x==beforePos2.x && cubeAlpha2.transform.localPosition.y==beforePos2.y,"MOVE LOCAL Z","ax:"+cubeAlpha2.transform.localPosition.x+" bx:"+beforePos.x+" ay:"+cubeAlpha2.transform.localPosition.y+" by:"+beforePos2.y);
  176. });
  177. AudioClip audioClip = LeanAudio.createAudio(new AnimationCurve( new Keyframe(0f, 1f, 0f, -1f), new Keyframe(1f, 0f, -1f, 0f)), new AnimationCurve( new Keyframe(0f, 0.001f, 0f, 0f), new Keyframe(1f, 0.001f, 0f, 0f)), LeanAudio.options());
  178. LeanTween.delayedSound(gameObject, audioClip, new Vector3(0f,0f,0f), 0.1f).setDelay(0.2f).setOnComplete( ()=>{
  179. LeanTest.expect(Time.time>0,"DELAYED SOUND");
  180. });
  181. // value2
  182. bool value2UpdateCalled = false;
  183. LeanTween.value(gameObject, new Vector2(0, 0), new Vector2(256, 96), 0.1f).setOnUpdate((Vector2 value) => {
  184. value2UpdateCalled = true;
  185. });
  186. LeanTween.delayedCall(0.2f, ()=>{
  187. LeanTest.expect( value2UpdateCalled, "VALUE2 UPDATE");
  188. } );
  189. StartCoroutine( timeBasedTesting() );
  190. }
  191. private GameObject cubeNamed( string name ){
  192. GameObject cube = Instantiate( boxNoCollider ) as GameObject;
  193. cube.name = name;
  194. return cube;
  195. }
  196. IEnumerator timeBasedTesting(){
  197. yield return new WaitForEndOfFrame();
  198. GameObject cubeNormal = cubeNamed("normalTimeScale");
  199. // float timeElapsedNormal = Time.time;
  200. LeanTween.moveX(cubeNormal, 12f, 1.5f).setIgnoreTimeScale( false ).setOnComplete( ()=>{
  201. timeElapsedNormalTimeScale = Time.time;
  202. });
  203. LTDescr[] descr = LeanTween.descriptions( cubeNormal );
  204. LeanTest.expect( descr.Length >= 0 && descr[0].to.x == 12f, "WE CAN RETRIEVE A DESCRIPTION");
  205. GameObject cubeIgnore = cubeNamed("ignoreTimeScale");
  206. LeanTween.moveX(cubeIgnore, 5f, 1.5f).setIgnoreTimeScale( true ).setOnComplete( ()=>{
  207. timeElapsedIgnoreTimeScale = Time.time;
  208. });
  209. yield return new WaitForSeconds(1.5f);
  210. LeanTest.expect( Mathf.Abs( timeElapsedNormalTimeScale - timeElapsedIgnoreTimeScale ) < 0.7f, "START IGNORE TIMING", "timeElapsedIgnoreTimeScale:"+timeElapsedIgnoreTimeScale+" timeElapsedNormalTimeScale:"+timeElapsedNormalTimeScale );
  211. // yield return new WaitForSeconds(100f);
  212. Time.timeScale = 4f;
  213. int pauseCount = 0;
  214. LeanTween.value( gameObject, 0f, 1f, 1f).setOnUpdate( ( float val )=>{
  215. pauseCount++;
  216. }).pause();
  217. // Bezier should end at exact end position not just 99% close to it
  218. Vector3[] roundCirc = new Vector3[]{ new Vector3(0f,0f,0f), new Vector3(-9.1f,25.1f,0f), new Vector3(-1.2f,15.9f,0f), new Vector3(-25f,25f,0f), new Vector3(-25f,25f,0f), new Vector3(-50.1f,15.9f,0f), new Vector3(-40.9f,25.1f,0f), new Vector3(-50f,0f,0f), new Vector3(-50f,0f,0f), new Vector3(-40.9f,-25.1f,0f), new Vector3(-50.1f,-15.9f,0f), new Vector3(-25f,-25f,0f), new Vector3(-25f,-25f,0f), new Vector3(0f,-15.9f,0f), new Vector3(-9.1f,-25.1f,0f), new Vector3(0f,0f,0f) };
  219. GameObject cubeRound = cubeNamed("bRound");
  220. Vector3 onStartPos = cubeRound.transform.position;
  221. LeanTween.moveLocal(cubeRound, roundCirc, 0.5f).setOnComplete( ()=>{
  222. LeanTest.expect(cubeRound.transform.position==onStartPos, "BEZIER CLOSED LOOP SHOULD END AT START","onStartPos:"+onStartPos+" onEnd:"+cubeRound.transform.position);
  223. });
  224. // Spline should end at exact end position not just 99% close to it
  225. Vector3[] roundSpline = new Vector3[]{ new Vector3(0f,0f,0f), new Vector3(0f,0f,0f), new Vector3(2f,0f,0f), new Vector3(0.9f,2f,0f), new Vector3(0f,0f,0f), new Vector3(0f,0f,0f) };
  226. GameObject cubeSpline = cubeNamed("bSpline");
  227. Vector3 onStartPosSpline = cubeSpline.transform.position;
  228. LeanTween.moveSplineLocal(cubeSpline, roundSpline, 0.5f).setOnComplete( ()=>{
  229. LeanTest.expect(Vector3.Distance(onStartPosSpline, cubeSpline.transform.position) <= 0.01f, "SPLINE CLOSED LOOP SHOULD END AT START","onStartPos:"+onStartPosSpline+" onEnd:"+cubeSpline.transform.position+" dist:"+Vector3.Distance(onStartPosSpline, cubeSpline.transform.position));
  230. });
  231. // Groups of tweens testing
  232. groupTweens = new LTDescr[ 1200 ];
  233. groupGOs = new GameObject[ groupTweens.Length ];
  234. groupTweensCnt = 0;
  235. int descriptionMatchCount = 0;
  236. for(int i = 0; i < groupTweens.Length; i++){
  237. GameObject cube = cubeNamed("c"+i);
  238. cube.transform.position = new Vector3(0,0,i*3);
  239. groupGOs[i] = cube;
  240. }
  241. yield return new WaitForEndOfFrame();
  242. bool hasGroupTweensCheckStarted = false;
  243. int setOnStartNum = 0;
  244. int setPosNum = 0;
  245. bool setPosOnUpdate = true;
  246. for(int i = 0; i < groupTweens.Length; i++){
  247. Vector3 finalPos = transform.position + Vector3.one*3f;
  248. Dictionary<string,object> finalDict = new Dictionary<string,object>{ {"final",finalPos}, {"go",groupGOs[i]} };
  249. groupTweens[i] = LeanTween.move(groupGOs[i], finalPos, 3f ).setOnStart( ()=>{
  250. setOnStartNum++;
  251. }).setOnUpdate( (Vector3 newPosition) => {
  252. if(transform.position.z > newPosition.z){
  253. setPosOnUpdate = false;
  254. }
  255. // Debug.LogWarning("New Position: " + newPosition.ToString());
  256. }).
  257. setOnCompleteParam( finalDict ).
  258. setOnComplete( (object param)=>{
  259. Dictionary<string,object> finalDictRetr = param as Dictionary<string,object>;
  260. Vector3 neededPos = (Vector3)finalDictRetr["final"];
  261. GameObject tweenedGo = finalDictRetr["go"] as GameObject;
  262. if(neededPos.ToString() == tweenedGo.transform.position.ToString())
  263. setPosNum++;
  264. else{
  265. // Debug.Log("neededPos:"+neededPos+" tweenedGo.transform.position:"+tweenedGo.transform.position);
  266. }
  267. if(hasGroupTweensCheckStarted==false){
  268. hasGroupTweensCheckStarted = true;
  269. LeanTween.delayedCall(gameObject, 0.1f, ()=>{
  270. LeanTest.expect( setOnStartNum == groupTweens.Length, "SETONSTART CALLS", "expected:"+groupTweens.Length+" was:"+setOnStartNum);
  271. LeanTest.expect( groupTweensCnt==groupTweens.Length, "GROUP FINISH", "expected "+groupTweens.Length+" tweens but got "+groupTweensCnt);
  272. LeanTest.expect( setPosNum==groupTweens.Length, "GROUP POSITION FINISH", "expected "+groupTweens.Length+" tweens but got "+setPosNum);
  273. LeanTest.expect( setPosOnUpdate, "GROUP POSITION ON UPDATE");
  274. });
  275. }
  276. groupTweensCnt++;
  277. });
  278. if(LeanTween.description(groupTweens[i].id).trans==groupTweens[i].trans)
  279. descriptionMatchCount++;
  280. }
  281. while (LeanTween.tweensRunning<groupTweens.Length)
  282. yield return null;
  283. LeanTest.expect( descriptionMatchCount==groupTweens.Length, "GROUP IDS MATCH" );
  284. int expectedSearch = groupTweens.Length+5;
  285. LeanTest.expect( LeanTween.maxSearch<=expectedSearch, "MAX SEARCH OPTIMIZED", "maxSearch:"+LeanTween.maxSearch+" should be:"+ expectedSearch);
  286. LeanTest.expect( LeanTween.isTweening() == true, "SOMETHING IS TWEENING" );
  287. // resume item before calling pause should continue item along it's way
  288. float previousXlt4 = cube4.transform.position.x;
  289. lt4 = LeanTween.moveX( cube4, 5.0f, 1.1f).setOnComplete( ()=>{
  290. LeanTest.expect( cube4!=null && previousXlt4!=cube4.transform.position.x, "RESUME OUT OF ORDER", "cube4:"+cube4+" previousXlt4:"+previousXlt4+" cube4.transform.position.x:"+(cube4!=null ? cube4.transform.position.x : 0));
  291. }).setDestroyOnComplete( true );
  292. lt4.resume();
  293. rotateRepeat = rotateRepeatAngle = 0;
  294. LeanTween.rotateAround(cube3, Vector3.forward, 360f, 0.1f).setRepeat(3).setOnComplete(rotateRepeatFinished).setOnCompleteOnRepeat(true).setDestroyOnComplete(true);
  295. yield return new WaitForEndOfFrame();
  296. LeanTween.delayedCall(0.1f*8f+1f, rotateRepeatAllFinished);
  297. int countBeforeCancel = LeanTween.tweensRunning;
  298. LeanTween.cancel( lt1Id );
  299. LeanTest.expect( countBeforeCancel==LeanTween.tweensRunning, "CANCEL AFTER RESET SHOULD FAIL", "expected "+countBeforeCancel+" but got "+LeanTween.tweensRunning);
  300. LeanTween.cancel(cube2);
  301. int tweenCount = 0;
  302. for(int i = 0; i < groupTweens.Length; i++){
  303. if(LeanTween.isTweening( groupGOs[i] ))
  304. tweenCount++;
  305. if(i%3==0)
  306. LeanTween.pause( groupGOs[i] );
  307. else if(i%3==1)
  308. groupTweens[i].pause();
  309. else
  310. LeanTween.pause( groupTweens[i].id );
  311. }
  312. LeanTest.expect( tweenCount==groupTweens.Length, "GROUP ISTWEENING", "expected "+groupTweens.Length+" tweens but got "+tweenCount );
  313. yield return new WaitForEndOfFrame();
  314. tweenCount = 0;
  315. for(int i = 0; i < groupTweens.Length; i++){
  316. if(i%3==0)
  317. LeanTween.resume( groupGOs[i] );
  318. else if(i%3==1)
  319. groupTweens[i].resume();
  320. else
  321. LeanTween.resume( groupTweens[i].id );
  322. if(i%2==0 ? LeanTween.isTweening( groupTweens[i].id ) : LeanTween.isTweening( groupGOs[i] ) )
  323. tweenCount++;
  324. }
  325. LeanTest.expect( tweenCount==groupTweens.Length, "GROUP RESUME" );
  326. LeanTest.expect( LeanTween.isTweening(cube1)==false, "CANCEL TWEEN LTDESCR" );
  327. LeanTest.expect( LeanTween.isTweening(cube2)==false, "CANCEL TWEEN LEANTWEEN" );
  328. LeanTest.expect( pauseCount==0, "ON UPDATE NOT CALLED DURING PAUSE", "expect pause count of 0, but got "+pauseCount);
  329. yield return new WaitForEndOfFrame();
  330. Time.timeScale = 0.25f;
  331. float tweenTime = 0.2f;
  332. float expectedTime = tweenTime * (1f/Time.timeScale);
  333. float start = Time.realtimeSinceStartup;
  334. bool onUpdateWasCalled = false;
  335. LeanTween.moveX(cube1, -5f, tweenTime).setOnUpdate( (float val)=>{
  336. onUpdateWasCalled = true;
  337. }).setOnComplete( ()=>{
  338. float end = Time.realtimeSinceStartup;
  339. float diff = end - start;
  340. LeanTest.expect( Mathf.Abs( expectedTime - diff) < 0.05f, "SCALED TIMING DIFFERENCE", "expected to complete in roughly "+expectedTime+" but completed in "+diff );
  341. LeanTest.expect( Mathf.Approximately(cube1.transform.position.x, -5f), "SCALED ENDING POSITION", "expected to end at -5f, but it ended at "+cube1.transform.position.x);
  342. LeanTest.expect( onUpdateWasCalled, "ON UPDATE FIRED" );
  343. });
  344. bool didGetCorrectOnUpdate = false;
  345. LeanTween.value(gameObject, new Vector3(1f,1f,1f), new Vector3(10f,10f,10f), 1f).setOnUpdate( ( Vector3 val )=>{
  346. didGetCorrectOnUpdate = val.x >= 1f && val.y >= 1f && val.z >= 1f;
  347. }).setOnComplete( ()=>{
  348. LeanTest.expect( didGetCorrectOnUpdate, "VECTOR3 CALLBACK CALLED");
  349. });
  350. yield return new WaitForSeconds( expectedTime );
  351. Time.timeScale = 1f;
  352. int ltCount = 0;
  353. GameObject[] allGos = FindObjectsOfType(typeof(GameObject)) as GameObject[];
  354. foreach (GameObject go in allGos) {
  355. if(go.name == "~LeanTween")
  356. ltCount++;
  357. }
  358. LeanTest.expect( ltCount==1, "RESET CORRECTLY CLEANS UP" );
  359. lotsOfCancels();
  360. }
  361. IEnumerator lotsOfCancels(){
  362. yield return new WaitForEndOfFrame();
  363. Time.timeScale = 4f;
  364. int cubeCount = 10;
  365. int[] tweensA = new int[ cubeCount ];
  366. GameObject[] aGOs = new GameObject[ cubeCount ];
  367. for(int i = 0; i < aGOs.Length; i++){
  368. GameObject cube = Instantiate( boxNoCollider ) as GameObject;
  369. cube.transform.position = new Vector3(0,0,i*2f);
  370. cube.name = "a"+i;
  371. aGOs[i] = cube;
  372. tweensA[i] = LeanTween.move(cube, cube.transform.position + new Vector3(10f,0,0), 0.5f + 1f * (1.0f/(float)aGOs.Length) ).id;
  373. LeanTween.color(cube, Color.red, 0.01f);
  374. }
  375. yield return new WaitForSeconds(1.0f);
  376. int[] tweensB = new int[ cubeCount ];
  377. GameObject[] bGOs = new GameObject[ cubeCount ];
  378. for(int i = 0; i < bGOs.Length; i++){
  379. GameObject cube = Instantiate( boxNoCollider ) as GameObject;
  380. cube.transform.position = new Vector3(0,0,i*2f);
  381. cube.name = "b"+i;
  382. bGOs[i] = cube;
  383. tweensB[i] = LeanTween.move(cube, cube.transform.position + new Vector3(10f,0,0), 2f).id;
  384. }
  385. for(int i = 0; i < aGOs.Length; i++){
  386. LeanTween.cancel( aGOs[i] );
  387. GameObject cube = aGOs[i];
  388. tweensA[i] = LeanTween.move(cube, new Vector3(0,0,i*2f), 2f).id;
  389. }
  390. yield return new WaitForSeconds(0.5f);
  391. for(int i = 0; i < aGOs.Length; i++){
  392. LeanTween.cancel( aGOs[i] );
  393. GameObject cube = aGOs[i];
  394. tweensA[i] = LeanTween.move(cube, new Vector3(0,0,i*2f) + new Vector3(10f,0,0), 2f ).id;
  395. }
  396. for(int i = 0; i < bGOs.Length; i++){
  397. LeanTween.cancel( bGOs[i] );
  398. GameObject cube = bGOs[i];
  399. tweensB[i] = LeanTween.move(cube, new Vector3(0,0,i*2f), 2f ).id;
  400. }
  401. yield return new WaitForSeconds(2.1f);
  402. bool inFinalPlace = true;
  403. for(int i = 0; i < aGOs.Length; i++){
  404. if(Vector3.Distance( aGOs[i].transform.position, new Vector3(0,0,i*2f) + new Vector3(10f,0,0) ) > 0.1f)
  405. inFinalPlace = false;
  406. }
  407. for(int i = 0; i < bGOs.Length; i++){
  408. if(Vector3.Distance( bGOs[i].transform.position, new Vector3(0,0,i*2f) ) > 0.1f)
  409. inFinalPlace = false;
  410. }
  411. LeanTest.expect(inFinalPlace,"AFTER LOTS OF CANCELS");
  412. }
  413. void rotateRepeatFinished(){
  414. if( Mathf.Abs(cube3.transform.eulerAngles.z)<0.0001f )
  415. rotateRepeatAngle++;
  416. rotateRepeat++;
  417. }
  418. void rotateRepeatAllFinished(){
  419. LeanTest.expect( rotateRepeatAngle==3, "ROTATE AROUND MULTIPLE", "expected 3 times received "+rotateRepeatAngle+" times" );
  420. LeanTest.expect( rotateRepeat==3, "ROTATE REPEAT", "expected 3 times received "+rotateRepeat+" times" );
  421. LeanTest.expect( cube3==null, "DESTROY ON COMPLETE", "cube3:"+cube3 );
  422. }
  423. void eventGameObjectCalled( LTEvent e ){
  424. eventGameObjectWasCalled = true;
  425. }
  426. void eventGeneralCalled( LTEvent e ){
  427. eventGeneralWasCalled = true;
  428. }
  429. }
  430. }