package Ġorg . mode lix . model Ċ Ċ import Ġorg . mode lix . model . api .* Ċ import Ġorg . mode lix . model . client . Id Generator Ċ import Ġkotlin . random . Random Ċ Ċ class ĠRandom Tree Change Generator ( private Ġval Ġid Generator : ĠId Generator , Ġprivate Ġval Ġrand : ĠRandom ) Ġ{ ĊĠĠĠ Ġval Ġchild Roles Ġ= ĠlistOf (" c Role 1 ", Ġ" c Role 2 ", Ġ" c Role 3 ") ĊĠĠĠ Ġval Ġproperty Roles Ġ= ĠlistOf (" p Role 1 ", Ġ" p Role 2 ", Ġ" p Role 3 ") ĊĠĠĠ Ġval Ġreference Roles Ġ= ĠlistOf (" r Role 1 ", Ġ" r Role 2 ", Ġ" r Role 3 ") ĊĠĠĠ Ġval Ġdelete Op : Ġ( I Write Transaction , ĠExpected Tree Data ?) Ġ-> ĠUnit Ġ= Ġ{ Ġt , Ġexpected Tree Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġnode ToDelete Ġ= ĠTree TestUtil ( t . tree , Ġrand ). random Leaf Node ĊĠĠĠĠĠĠĠ Ġif Ġ( node ToDelete Ġ!= Ġ 0 L Ġ&& Ġnode ToDelete Ġ!= ĠI Tree . ROOT _ ID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . delete Node ( node ToDelete ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expected Tree Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Tree . removeChild ( expected Tree . expected Parents [ node ToDelete ] !! , Ġexpected Tree . expected Roles [ node ToDelete ], Ġnode ToDelete ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Tree . expected Parents [ node ToDelete ] Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Tree . expected Roles . remove ( node ToDelete ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Tree . expected Deletes . add ( node ToDelete ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġadd New Op : Ġ( I Write Transaction , ĠExpected Tree Data ?) Ġ-> ĠUnit Ġ= Ġ{ Ġt , Ġexpected Tree Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= ĠTree TestUtil ( t . tree , Ġrand ). random Node With Root ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ!= Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Id Ġ= Ġid Generator . generate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrole Ġ= Ġchild Roles [ rand . nextInt ( child Roles . size )] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġif Ġ( rand . next Boolean ()) Ġrand . nextInt ( t . getChildren ( parent , Ġrole ). count (). toInt () Ġ+ Ġ 1 ) Ġelse Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . add New Child ( parent , Ġrole , Ġindex , Ġchild Id , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expected Tree Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Tree . expected Parents [ child Id ] Ġ= Ġparent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Tree . expected Roles [ child Id ] Ġ= Ġrole ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Tree . insert Child ( parent , Ġrole , Ġindex , Ġchild Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġset Property Op : Ġ( I Write Transaction , ĠExpected Tree Data ?) Ġ-> ĠUnit Ġ= Ġ{ Ġt , Ġexpected Tree Ġ-> ĊĠĠĠĠĠĠĠ Ġval ĠnodeId Ġ= ĠTree TestUtil ( t . tree , Ġrand ). random Node Without Root ĊĠĠĠĠĠĠĠ Ġif Ġ( nodeId Ġ!= Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrole Ġ= Ġproperty Roles [ rand . nextInt ( property Roles . size )] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchars Ġ= Ġ" abcd AB CD â ĵ Ĳ â ĵ ĳ â ĵ Ĵ â ĵ ĵ " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġ( 1 .. 1 0 ). map Ġ{ Ġchars . elementAt ( rand . nextInt ( chars . length )) Ġ}. join ToString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . setProperty ( nodeId , Ġrole , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġset Reference Op : Ġ( I Write Transaction , ĠExpected Tree Data ?) Ġ-> ĠUnit Ġ= Ġ{ Ġt , Ġexpected Tree Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġsource Id Ġ= ĠTree TestUtil ( t . tree , Ġrand ). random Node Without Root ĊĠĠĠĠĠĠĠ Ġval Ġtarget Id Ġ= ĠTree TestUtil ( t . tree , Ġrand ). random Node Without Root ĊĠĠĠĠĠĠĠ Ġif Ġ( source Id Ġ!= Ġ 0 L Ġ&& Ġtarget Id Ġ!= Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrole Ġ= Ġreference Roles [ rand . nextInt ( reference Roles . size )] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . set Reference Target ( source Id , Ġrole , ĠP Node Reference ( target Id )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġmove Op : Ġ( I Write Transaction , ĠExpected Tree Data ?) Ġ-> ĠUnit Ġ= Ġ{ Ġt , Ġexpected Tree Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġutil Ġ= ĠTree TestUtil ( t . tree , Ġrand ) ĊĠĠĠĠĠĠĠ Ġval Ġchild Id Ġ= Ġutil . random Node Without Root ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġutil . getRandom Node ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġutil ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. all Nodes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit : ĠLong Ġ-> Ġutil . get An cestors ( it , Ġtrue ). none Ġ{ Ġit 2 : ĠLong Ġ-> Ġit 2 Ġ== Ġchild Id Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( child Id Ġ!= Ġ 0 L Ġ&& Ġparent Ġ!= Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrole Ġ= Ġchild Roles [ rand . nextInt ( child Roles . size )] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġif Ġ( rand . next Boolean ()) Ġrand . nextInt ( t . getChildren ( parent , Ġrole ). count () Ġ+ Ġ 1 ) Ġelse Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . move Child ( parent , Ġrole , Ġindex , Ġchild Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expected Tree Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Parent Ġ= Ġexpected Tree . expected Parents [ child Id ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Role Ġ= Ġexpected Tree . expected Roles [ child Id ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Parent Ġ== Ġparent Ġ&& Ġold Role Ġ== Ġrole ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Index Ġ= Ġexpected Tree . expected Children [ Pair ( old Parent , Ġold Role )] !!. indexOf ( child Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Index Ġ< Ġindex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Tree . removeChild ( old Parent , Ġold Role , Ġchild Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Tree . expected Parents [ child Id ] Ġ= Ġparent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Tree . expected Roles [ child Id ] Ġ= Ġrole ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Tree . insert Child ( parent , Ġrole , Ġindex , Ġchild Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġoperations : ĠList <( I Write Transaction , ĠExpected Tree Data ?) Ġ-> ĠUnit > Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ Ġdelete Op , ĊĠĠĠĠĠĠĠ Ġadd New Op , ĊĠĠĠĠĠĠĠ Ġset Property Op , ĊĠĠĠĠĠĠĠ Ġset Reference Op , ĊĠĠĠĠĠĠĠ Ġmove Op ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġgrowing Operations Only (): ĠRandom Tree Change Generator Ġ{ ĊĠĠĠĠĠĠĠ Ġoperations Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd New Op , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Property Op , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Reference Op ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Operation Only (): ĠRandom Tree Change Generator Ġ{ ĊĠĠĠĠĠĠĠ Ġoperations Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd New Op ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġapply Random Change ( tree : ĠI Tree , Ġexpected Tree : ĠExpected Tree Data ?): ĠI Tree Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbranch Ġ= ĠP Branch ( tree , Ġid Generator ) ĊĠĠĠĠĠĠĠ Ġapply Random Change ( branch , Ġexpected Tree ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbranch . compute Read Ġ{ Ġbranch . transaction . tree Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġapply Random Change ( branch : ĠI Branch , Ġexpected Tree : ĠExpected Tree Data ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġbranch . run Write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġbranch . write Transaction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperations [ rand . nextInt ( operations . size )]( t , Ġexpected Tree ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ