11import { ReactNativeWrapper , overridePlatform } from "./wrapper" ;
22
3+ class Command {
4+ constructor ( public name : string , public target : number , public details : string ) { }
5+ toString ( ) : string {
6+ return `${ this . name } +${ this . target } +${ this . details } ` ;
7+ }
8+ }
9+
310export class MockReactNativeWrapper extends ReactNativeWrapper {
411 commandLogs : Array < Command > ;
512 root : NativeElement ;
@@ -46,34 +53,44 @@ export class MockReactNativeWrapper extends ReactNativeWrapper {
4653 // moveTo and addAt are both relative to the final state of the View's children.
4754 manageChildren ( parentTag : number , moveFrom : Array < number > , moveTo : Array < number > , addTags : Array < number > , addAt : Array < number > , removeFrom : Array < number > ) {
4855 var parentElement = this . nativeElementMap . get ( parentTag ) ;
49- var toBeDeleted = removeFrom || [ ] ;
56+ var toBeDeleted = [ ] ;
5057 var toBeAdded : Array < any > = [ ] ;
51- var toBeMoved : Array < any > = [ ] ;
52- if ( moveFrom && moveTo && moveFrom . length == moveTo . length ) {
53- toBeDeleted = toBeDeleted . concat ( moveFrom ) . sort ( ) ;
58+ if ( moveFrom && moveTo && moveFrom . length != moveTo . length ) {
59+ throw new Error ( `manageChildren - MOVE - Invalid lengths: ${ moveFrom . length } vs ${ moveTo . length } ` ) ;
60+ }
61+ if ( addTags && addAt && addTags . length != addAt . length ) {
62+ throw new Error ( `manageChildren - MOVE - Invalid lengths: ${ addTags . length } vs ${ addAt . length } ` ) ;
63+ }
64+ //Detach commands
65+ if ( removeFrom ) {
66+ for ( var i = 0 ; i < removeFrom . length ; i ++ ) {
67+ var index = removeFrom [ removeFrom . length - i - 1 ] ;
68+ toBeDeleted . push ( index ) ;
69+ this . commandLogs . push ( new Command ( 'DETACH' , parentTag , '' + index ) ) ;
70+ }
71+ }
72+ //Move commands
73+ if ( moveFrom ) {
5474 for ( var i = 0 ; i < moveFrom . length ; i ++ ) {
5575 var tag = parentElement . children [ moveFrom [ i ] ] . tag ;
76+ toBeDeleted . push ( moveFrom [ i ] ) ;
5677 toBeAdded . push ( { index : moveTo [ i ] , tag : tag } ) ;
57- toBeMoved . push ( tag ) ;
5878 }
79+ this . commandLogs . push ( new Command ( 'MOVE' , parentTag , '' + moveFrom . join ( ',' ) + '+' + moveTo . join ( ',' ) ) ) ;
5980 }
60- if ( addTags && addAt && addTags . length == addAt . length ) {
81+ //Attach commands
82+ if ( addTags ) {
6183 for ( var i = 0 ; i < addTags . length ; i ++ ) {
6284 toBeAdded . push ( { index : addAt [ i ] , tag : addTags [ i ] } ) ;
85+ this . commandLogs . push ( new Command ( 'ATTACH' , parentTag , addTags [ i ] + '+' + addAt [ i ] ) ) ;
6386 }
6487 }
65- //Detach
88+ //Update data structure
89+ toBeDeleted . sort ( ) ;
90+ toBeAdded . sort ( ( a , b ) => { return a . index - b . index } ) ;
6691 for ( var i = 0 ; i < toBeDeleted . length ; i ++ ) {
67- var index = toBeDeleted [ toBeDeleted . length - i - 1 ] ;
68- var tag = parentElement . children [ index ] . tag ;
69- parentElement . children . splice ( index , 1 ) ;
70- if ( toBeMoved . indexOf ( tag ) == - 1 ) {
71- this . nativeElementMap . delete ( tag ) ;
72- }
73- this . commandLogs . push ( new Command ( 'DETACH' , parentTag , '' + index ) ) ;
92+ parentElement . children . splice ( toBeDeleted [ toBeDeleted . length - i - 1 ] , 1 ) ;
7493 }
75- //Attach
76- toBeAdded . sort ( ( a , b ) => { return a . index - b . index } ) ;
7794 for ( var i = 0 ; i < toBeAdded . length ; i ++ ) {
7895 var item = toBeAdded [ i ] ;
7996 var element = this . nativeElementMap . get ( item . tag ) ;
@@ -83,8 +100,6 @@ export class MockReactNativeWrapper extends ReactNativeWrapper {
83100 } else {
84101 throw new Error ( `manageChildren - ATTACH - Invalid index ${ item . index } , size is ${ parentElement . children . length } ` ) ;
85102 }
86-
87- this . commandLogs . push ( new Command ( 'ATTACH' , parentTag , item . tag + '+' + item . index ) ) ;
88103 }
89104 }
90105
@@ -158,13 +173,6 @@ export class MockReactNativeWrapper extends ReactNativeWrapper {
158173 }
159174}
160175
161- class Command {
162- constructor ( public name : string , public target : number , public details : string ) { }
163- toString ( ) : string {
164- return `${ this . name } +${ this . target } +${ this . details } ` ;
165- }
166- }
167-
168176export class NativeElement {
169177 name : string ;
170178 tag : number ;
0 commit comments