package Ġorg . intellij . clojure . lang Ċ Ċ import Ġcom . intellij . openapi . action System . Action Manager Ċ import Ġcom . intellij . openapi . action System . An Action Ċ import Ġcom . intellij . openapi . action System . Ide Actions Ċ import Ġcom . intellij . openapi . editor . ex . Editor Ex Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . openapi . util . text . StringUtil Ċ import Ġcom . intellij . test Framework . fixtures . Base Platform TestCase Ċ import Ġorg . intellij . clojure . actions .* Ċ import Ġorg . intellij . clojure . editor . Clo jure Smart Keys Options Ċ import Ġorg . intellij . clojure . util . service Ċ Ċ /** Ċ Ġ* Ġ@ author Ġg reg sh Ċ Ġ*/ Ċ class ĠStructural Editing Test Ġ: ĠBase Platform TestCase () Ġ{ ĊĠ Ġoverride Ġfun ĠsetUp () Ġ{ ĊĠĠĠ Ġsuper . setUp () ĊĠĠĠ Ġservice < Clo jure Smart Keys Options >(). load State ( Clo jure Smart Keys Options ( true , Ġtrue )) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠtearDown () Ġ{ ĊĠĠĠ Ġservice < Clo jure Smart Keys Options >(). load State ( Clo jure Smart Keys Options ()) ĊĠĠĠ Ġsuper . te ar Down () ĊĠ Ġ} ĊĊĠ Ġ// Ġbasic Ġtests ĊĠ Ġfun Ġtest Sl ur p F wd 1 () Ġ= Ġdo Test ("( a Ġb Ġ( c Ġd Ġ| e Ġf ) Ġg Ġh )", Ġ"( a Ġb Ġ( c Ġd Ġ| e Ġf Ġg ) Ġh )") ĊĠ Ġfun Ġtest Sl ur p B wd 1 () Ġ= Ġdo Test ("( a Ġb Ġ( c Ġd Ġ| e Ġf ) Ġg Ġh )", Ġ"( a Ġ( b Ġc Ġd Ġ| e Ġf ) Ġg Ġh )") ĊĠ Ġfun Ġtest Bar f F wd 1 () Ġ= Ġdo Test ("( a Ġb Ġ( c Ġd Ġ| e Ġf ) Ġg Ġh )", Ġ"( a Ġb Ġ( c Ġd Ġ| e ) Ġf Ġg Ġh )") ĊĠ Ġfun Ġtest Bar f B wd 1 () Ġ= Ġdo Test ("( a Ġb Ġ( c Ġd Ġ| e Ġf ) Ġg Ġh )", Ġ"( a Ġb Ġc Ġ( d Ġ| e Ġf ) Ġg Ġh )") ĊĠ Ġfun Ġtest Sp lice 1 () Ġ= Ġdo Test ("( a Ġb Ġ( c Ġd Ġ| e Ġf ) Ġg Ġh )", Ġ"( a Ġb Ġ| e Ġf Ġg Ġh )") ĊĠ Ġfun Ġtest Sp lice 2 () Ġ= Ġdo Test ("( a Ġb Ġ| ( c Ġd Ġe Ġf ) Ġg Ġh )", Ġ"( c Ġd Ġe Ġf ) Ġg Ġh ") ĊĠ Ġfun Ġtest R ise 1 () Ġ= Ġdo Test ("( a Ġb Ġ( c Ġd Ġ| e Ġf ) Ġg Ġh )", Ġ"( a Ġb Ġ( c Ġd Ġ( | e ) Ġf ) Ġg Ġh )") ĊĠ Ġfun Ġtest Kill 1 () Ġ= Ġdo Test ("( a Ġb Ġ( c Ġd Ġ| e Ġf ) Ġg Ġh )", Ġ"( a Ġb Ġ| g Ġh )") ĊĊĠ Ġfun Ġtest Kill NL 1 () Ġ= Ġdo Test ("( a Ġb \ n Ġ( c Ġd Ġ| e Ġf )\ n Ġg Ġh )", Ġ"( a Ġb \ n | Ġg Ġh )") ĊĊĠ Ġfun Ġtest R ise Multi 1 () Ġ= Ġdo Test (" (( | a ) Ġ( | b )) ", Ġ" (( | a ) Ġ( | b )) ") Ġ// Ġno - op ĊĠ Ġfun Ġtest Kill Multi 1 () Ġ= Ġdo Test (" (( | a ) Ġ( | b )) ", Ġ" (( | a ) Ġ( | b )) ") Ġ// Ġno - op ĊĊĠ Ġfun Ġtest Sl ur p F wd Meta 1 () Ġ= Ġdo Test ("( a Ġb Ġ( c Ġd Ġ| e Ġf ) Ġ^ { Ġ} Ġg Ġh )", Ġ"( a Ġb Ġ( c Ġd Ġ| e Ġf Ġ^ { Ġ} Ġg ) Ġh )") ĊĠ Ġfun Ġtest Sl ur p B wd Meta 1 () Ġ= Ġdo Test ("( a Ġ^ { Ġ} Ġb Ġ( c Ġd Ġ| e Ġf ) Ġg Ġh )", Ġ"( a Ġ( ^{ Ġ} Ġb Ġc Ġd Ġ| e Ġf ) Ġg Ġh )") ĊĠ Ġfun Ġtest Bar f F wd Meta 1 () Ġ= Ġdo Test ("( a Ġb Ġ( c Ġd Ġ| e Ġ^ { Ġ} Ġf ) Ġg Ġh )", Ġ"( a Ġb Ġ( c Ġd Ġ| e ) Ġ^ { Ġ} Ġf Ġg Ġh )") ĊĠ Ġfun Ġtest Bar f B wd Meta 1 () Ġ= Ġdo Test ("( a Ġb Ġ( ^{ Ġ} Ġc Ġd Ġ| e Ġf ) Ġg Ġh )", Ġ"( a Ġb Ġ^ { Ġ} Ġc Ġ( d Ġ| e Ġf ) Ġg Ġh )") ĊĠ Ġfun Ġtest Sp lice Meta 1 () Ġ= Ġdo Test ("( a Ġb Ġ^ { Ġ} Ġ( c Ġd Ġ| e Ġf ) Ġ^ { Ġ} Ġg Ġh )", Ġ"( a Ġb Ġ| e Ġf Ġ^ { Ġ} Ġg Ġh )") ĊĠ Ġfun Ġtest R ise Meta 1 () Ġ= Ġdo Test ("( a Ġb Ġ( c Ġd Ġ^ { Ġ} Ġ| e Ġf ) Ġg Ġh )", Ġ"( a Ġb Ġ( c Ġd Ġ( ^{ Ġ} Ġ| e ) Ġf ) Ġg Ġh )") ĊĠ Ġfun Ġtest Kill Meta 1 () Ġ= Ġdo Test ("( a Ġb Ġ^ { Ġ} Ġ( c Ġd Ġ| ^{ Ġ} Ġe Ġf ) Ġg Ġh )", Ġ"( a Ġb Ġ| g Ġh )") ĊĊĠ Ġfun Ġtest Back space 1 () Ġ= Ġdo Test ("( a Ġb Ġ( c Ġd Ġe Ġf )| Ġg Ġh )", Ġ"( a Ġb Ġ| g Ġh )") ĊĠ Ġfun Ġtest Back space 2 () Ġ= Ġdo Test ("( a Ġb Ġ( | c Ġd Ġe Ġf ) Ġg Ġh )", Ġ"( a Ġb Ġ| c Ġd Ġe Ġf Ġg Ġh )") ĊĠ Ġfun Ġtest Back space 3 () Ġ= Ġdo Test ("( a Ġb Ġ(< selection > c </ selection > Ġd Ġe Ġf ) Ġg Ġh )", Ġ"( a Ġb Ġ( Ġd Ġe Ġf ) Ġg Ġh )") ĊĠ Ġfun Ġtest Back space 4 () Ġ= Ġdo Test ("( a Ġb Ġ( c Ġd Ġe Ġf )| ) Ġg Ġh )", Ġ"( a Ġb Ġ( c Ġd Ġe Ġf |) Ġg Ġh )") ĊĠ Ġfun Ġtest Back space 5 () Ġ= Ġdo Test ("( a Ġb Ġ( c Ġd < selection > Ġe Ġf ) Ġ</ selection > g Ġh )", Ġ"( a Ġb Ġ( c Ġdg Ġh )") ĊĠ Ġfun Ġtest Back space 6 () Ġ= Ġdo Test ("( a Ġb Ġ#{ | c Ġd Ġe Ġf } Ġg Ġh )", Ġ"( a Ġb Ġ| c Ġd Ġe Ġf Ġg Ġh )") ĊĠ Ġfun Ġtest Back space 7 () Ġ= Ġdo Test ("( a Ġb Ġ# |{ c Ġd Ġe Ġf } Ġg Ġh )", Ġ"( a Ġb Ġ| { c Ġd Ġe Ġf } Ġg Ġh )") ĊĠ Ġfun Ġtest Delete 1 () Ġ= Ġdo Test ("( a Ġb Ġ| ( c Ġd Ġe Ġf ) Ġg Ġh )", Ġ"( a Ġb Ġ| g Ġh )") ĊĠ Ġfun Ġtest Delete 2 () Ġ= Ġdo Test ("( a Ġb Ġ( c Ġd Ġe Ġf |) Ġg Ġh )", Ġ"( a Ġb Ġc Ġd Ġe Ġf | Ġg Ġh )") ĊĠ Ġfun Ġtest Delete 3 () Ġ= Ġdo Test ("( a Ġb Ġ( c Ġd Ġe Ġ< selection > f </ selection >) Ġg Ġh )", Ġ"( a Ġb Ġ( c Ġd Ġe Ġ) Ġg Ġh )") ĊĠ Ġfun Ġtest Delete 4 () Ġ= Ġdo Test ("( a Ġb Ġ( |( c Ġd Ġe Ġf ) Ġg Ġh )", Ġ"( a Ġb Ġ( | c Ġd Ġe Ġf ) Ġg Ġh )") ĊĊĠ Ġfun Ġtest Delete Meta 1 () Ġ= Ġdo Test ("( a Ġb Ġ| ^{ : x Ġ 1 } Ġ( c Ġd Ġe Ġf ) Ġg Ġh )", Ġ"( a Ġb Ġ( c Ġd Ġe Ġf ) Ġg Ġh )") ĊĠ Ġfun Ġtest Delete Meta 2 () Ġ= Ġdo Test ("( a Ġb Ġ^ {: x Ġ 1 |} Ġ( c Ġd Ġe Ġf ) Ġg Ġh )", Ġ"( a Ġb Ġ: x Ġ 1 Ġ( c Ġd Ġe Ġf ) Ġg Ġh )") ĊĠ Ġfun Ġtest Delete Meta 3 () Ġ= Ġdo Test ("( a Ġb Ġ^ {: x Ġ 1 } Ġ| ( c Ġd Ġe Ġf ) Ġg Ġh )", Ġ"( a Ġb Ġg Ġh )") ĊĠ Ġfun Ġtest Delete Meta 4 () Ġ= Ġdo Test ("( a Ġb Ġ^ {: x Ġ 1 } Ġ( c Ġd Ġe Ġf |) Ġg Ġh )", Ġ"( a Ġb Ġc Ġd Ġe Ġf Ġg Ġh )") ĊĠ Ġfun Ġtest Back space Meta 1 () Ġ= Ġdo Test ("( a Ġb Ġ^ {: x Ġ 1 } Ġ( c Ġd Ġe Ġf )| Ġg Ġh )", Ġ"( a Ġb Ġ| g Ġh )") ĊĠ Ġfun Ġtest Back space Meta 2 () Ġ= Ġdo Test ("( a Ġb Ġ^ {: x Ġ 1 } Ġ( | c Ġd Ġe Ġf ) Ġg Ġh )", Ġ"( a Ġb Ġ| c Ġd Ġe Ġf Ġg Ġh )") ĊĠ Ġfun Ġtest Back space Meta 3 () Ġ= Ġdo Test ("( a Ġb Ġ^ {: x Ġ 1 }| Ġ( c Ġd Ġe Ġf ) Ġg Ġh )", Ġ"( a Ġb Ġ| ( c Ġd Ġe Ġf ) Ġg Ġh )") ĊĠ Ġfun Ġtest Back space Meta 4 () Ġ= Ġdo Test ("( a Ġb Ġ^ { |: x Ġ 1 } Ġ( c Ġd Ġe Ġf ) Ġg Ġh )", Ġ"( a Ġb Ġ|: x Ġ 1 Ġ( c Ġd Ġe Ġf ) Ġg Ġh )") ĊĊĠ Ġfun Ġtest Type Paren 1 () Ġ= Ġdo Type ("| namespace / name ", Ġ" (", Ġ"( | namespace / name )") ĊĠ Ġfun Ġtest Type Paren 2 () Ġ= Ġdo Type ("| namespace / name )", Ġ" (", Ġ"( | namespace / name )") ĊĠ Ġfun Ġtest Type Paren 3 () Ġ= Ġdo Type (" |: namespace / name ", Ġ" (", Ġ"( |: namespace / name )") ĊĠ Ġfun Ġtest Type Paren 4 () Ġ= Ġdo Type (" |: namespace / name ", Ġ" ()", Ġ" (() Ġ: namespace / name )") ĊĠ Ġfun Ġtest Type Paren 5 () Ġ= Ġdo Type (" ab | cd ", Ġ" ))) ", Ġ" ab Ġ() Ġ( |) Ġcd ") ĊĠ Ġfun Ġtest Type Paren 6 () Ġ= Ġdo Type ("| abc ", Ġ"#{ ", Ġ"#{ | abc }") ĊĠ Ġfun Ġtest Type HP aren 1 () Ġ= Ġdo Type ("| abc ", Ġ"# : foo Ġ{ ", Ġ"# : foo Ġ{| abc }") ĊĠ Ġfun Ġtest Type HP aren 2 () Ġ= Ġdo Type ("| abc ", Ġ"# ::{ ", Ġ"# ::{ | abc }") ĊĠ Ġfun Ġtest Type HP aren 3 () Ġ= Ġdo Type ("| ^{ : x Ġ() } Ġ( foo ) Ġbar ", Ġ"# ::{ ", Ġ"# ::{ ^{ : x Ġ() } Ġ( foo )} Ġbar ") ĊĠ Ġfun Ġtest Type HP aren 4 () Ġ= Ġdo Type ("| Ġ^ {: x Ġ() } Ġ( foo ) Ġbar ", Ġ"# ::{ ", Ġ"# ::{ |} Ġ^ {: x Ġ() } Ġ( foo ) Ġbar ") ĊĊĠ Ġfun Ġtest Type Paren In Empty 1 () Ġ= Ġdo Type ("", Ġ" (", Ġ" () ") ĊĠ Ġfun Ġtest Type Paren In Empty 2 () Ġ= Ġdo Type ("", Ġ" )", Ġ" () ") ĊĠ Ġfun Ġtest Type Paren In String 1 () Ġ= Ġdo Type ("\" ab Ġ| \"", Ġ" (", Ġ"\" ab Ġ( | \" ") ĊĠ Ġfun Ġtest Type Paren In String 2 () Ġ= Ġdo Type ("\" ab Ġ| \"", Ġ" )", Ġ"\" ab Ġ) | \" ") ĊĠ Ġfun Ġtest Type Paren In Comment 1 () Ġ= Ġdo Type ("; Ġab Ġ| ", Ġ" (", Ġ"; Ġab Ġ( | ") ĊĠ Ġfun Ġtest Type Paren In Comment 2 () Ġ= Ġdo Type ("; Ġab Ġ| ", Ġ" )", Ġ"; Ġab Ġ) | ") ĊĊĠ Ġfun Ġtest All Actions Empty () Ġ= Ġall Actions . forEach Ġ{ Ġit . run ("", Ġ"") Ġ} ĊĠ Ġfun Ġtest All Actions Sym 0 1 () Ġ= Ġall Actions . forEach Ġ{ Ġit . run ("| a ", Ġnull ) Ġ} ĊĠ Ġfun Ġtest All Actions Sym 0 2 () Ġ= Ġall Actions . forEach Ġ{ Ġit . run (" a | ", Ġnull ) Ġ} ĊĠ Ġfun Ġtest All Actions Par 0 3 () Ġ= Ġall Actions . forEach Ġ{ Ġit . run (" |( ", Ġnull ) Ġ} ĊĠ Ġfun Ġtest All Actions Par 0 4 () Ġ= Ġall Actions . forEach Ġ{ Ġit . run (" (| ", Ġnull ) Ġ} ĊĠ Ġfun Ġtest All Actions Par 0 5 () Ġ= Ġall Actions . forEach Ġ{ Ġit . run ("| )", Ġnull ) Ġ} ĊĠ Ġfun Ġtest All Actions Par 0 6 () Ġ= Ġall Actions . forEach Ġ{ Ġit . run (" )| ", Ġnull ) Ġ} ĊĠ Ġfun Ġtest All Actions Par 0 7 () Ġ= Ġall Actions . forEach Ġ{ Ġit . run (" (| )", Ġnull ) Ġ} ĊĠ Ġfun Ġtest All Actions Par 0 8 () Ġ= Ġall Actions . forEach Ġ{ Ġit . run (" |() ", Ġnull ) Ġ} ĊĠ Ġfun Ġtest All Actions Par 0 9 () Ġ= Ġall Actions . forEach Ġ{ Ġit . run (" () | ", Ġnull ) Ġ} ĊĠ Ġfun Ġtest All Actions Par 1 0 () Ġ= Ġall Actions . forEach Ġ{ Ġit . run (" (| a )", Ġnull ) Ġ} ĊĊĠ Ġ// Ġbasic Ġfixes ĊĠ Ġfun Ġtest Sl ur p F wd Fix 1 () Ġ= Ġdo Test ("( a Ġ( |) Ġb Ġc )", Ġ"( a Ġ( | b ) Ġc )") ĊĠ Ġfun Ġtest Sl ur p F wd Fix 2 () Ġ= Ġdo Test ("( a Ġ( | b .) Ġc )", Ġ"( a Ġ( | b . Ġc )) ") ĊĊĠ Ġfun Ġtest Bar f F wd Fix 1 () Ġ= Ġdo Test ("( a Ġ( | b ) Ġc )", Ġ"( a Ġ( |) Ġb Ġc )") ĊĠ Ġfun Ġtest Bar f F wd Fix 2 () Ġ= Ġdo Test ("( a Ġ( | b . Ġc )) ", Ġ"( a Ġ( | b .) Ġc )") ĊĠ Ġfun Ġtest Bar f F wd Fix 3 () Ġ= Ġdo Test ("( a Ġ( b |) Ġc )", Ġ"( a Ġ( |) Ġb Ġc )") ĊĠ Ġfun Ġtest Bar f F wd Fix 4 () Ġ= Ġdo Test ("( a Ġ( b |. Ġc )) ", Ġ"( a Ġ( b |. ) Ġc )") ĊĠ Ġfun Ġtest Bar f B wd Fix 1 () Ġ= Ġdo Test (" (| x )", Ġ" x Ġ( |) ") ĊĠ Ġfun Ġtest Bar f B wd Fix 2 () Ġ= Ġdo Test ("( x | )", Ġ" x Ġ( |) ") ĊĊĠ Ġfun Ġtest R ise Fix 1 () Ġ= Ġdo Test (" a Ġ: | ns / kw d Ġb ", Ġ" a Ġ(: | ns / kw d ) Ġb ") ĊĠ Ġfun Ġtest R ise Fix 2 () Ġ= Ġdo Test (" a Ġ< selection >: ns / kw d Ġb </ selection >", Ġ" a Ġ(: ns / kw d Ġb )") ĊĠ Ġfun Ġtest R ise Fix 3 () Ġ= Ġdo Test (" a Ġ: < selection > ns / kw d Ġb </ selection >", Ġ" a Ġ(: ns / kw d Ġb )") ĊĊĠ Ġfun Ġtest Context 1 () Ġ= Ġcheck Form Context (" x Ġ() * Ġy Ġ( | )* Ġx ", ĠMode . CONTEXT ) ĊĠ Ġfun Ġtest Context 2 () Ġ= Ġcheck Form Context (" x Ġ() Ġ(* a Ġb | Ġc )* Ġx ", ĠMode . CONTEXT ) ĊĠ Ġfun Ġtest Context 3 () Ġ= Ġcheck Form Context (" x Ġ() * Ġ^ {} Ġ| ( a Ġb Ġc )* Ġx ", ĠMode . CONTEXT ) ĊĠ Ġfun Ġtest Context 4 () Ġ= Ġcheck Form Context (" x Ġ() * Ġ^ {} Ġ( a Ġb Ġc | )* Ġx ", ĠMode . CONTEXT ) ĊĊĠ Ġprivate Ġfun Ġdo Test ( before : ĠString , Ġafter : ĠString ) Ġ= Ġtest Action . run ( before , Ġafter ) ĊĠ Ġprivate Ġfun Ġdo Type ( before : ĠString , Ġwhat : ĠString , Ġafter : ĠString ) Ġ= Ġdo Test ( before , Ġafter ) Ġ{ Ġmy Fixture . type ( what ) Ġ} ĊĊĠ Ġprivate Ġfun Ġcheck Form Context ( before : ĠString , Ġmode : ĠMode ) Ġ= Ġmy Fixture . run Ġ{ ĊĠĠĠ Ġval Ġcontext Ġ= Ġbefore . indexOf ('* '). let Ġ{ ĠText Range ( it , Ġbefore . indexOf ('* ', Ġit Ġ+ Ġ 1 ) Ġ- Ġ 2 ) Ġ} ĊĠĠĠ ĠassertTrue ( context . start Offset Ġ>= Ġ 0 Ġ&& Ġcontext . end Offset Ġ>= Ġ 0 ) ĊĠĠĠ Ġconfigure By Text ( Clo jure FileType , Ġbefore . replace ("| ", Ġ"< caret > "). replace ("* ", Ġ"")) ĊĠĠĠ Ġval Ġrange Ġ= Ġform Context Range Approx ( my Fixture . editor Ġas ĠEditor Ex , Ġmy Fixture . editor . caret Model . offset , Ġmode ) ĊĠĠĠ ĠassertEquals ( my Fixture . editor . document . getText ( context ), Ġmy Fixture . editor . document . getText ( range )) ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġtest Action : ĠAn Action ĊĠĠĠ Ġget () Ġ= Ġget Test Name ( false ). let Ġ{ Ġname Ġ-> ĊĠĠĠĠĠ Ġall Actions . find Ġ{ Ġname . contains ( StringUtil . trim End ( it . java Class . simple Name !! , Ġ" Action ")) Ġ} !! ĊĠĠĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠAn Action . run ( before : ĠString , Ġafter : ĠString ?) Ġ= Ġdo Test ( before , Ġafter ) Ġ{ Ġmy Fixture . test Action ( this @ run ) Ġ} ĊĊĠ Ġprivate Ġfun Ġdo Test ( before : ĠString , Ġafter : ĠString ?, Ġaction : Ġ() Ġ-> ĠUnit ) Ġ= Ġmy Fixture . run Ġ{ ĊĠĠĠ Ġconfigure By Text ( Clo jure FileType , Ġbefore . replace ("| ", Ġ"< caret > ")) ĊĠĠĠ Ġaction () ĊĠĠĠ Ġif Ġ( after Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġcheck Result ( after . replace ("| ", Ġ"< caret > ")) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġall Actions : ĠList < An Action > ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠ Ġval Ġaction Man Ġ= ĠAction Manager . getInstance () ĊĠĠĠĠĠ Ġreturn ĠlistOf < An Action >( ĊĠĠĠĠĠĠĠĠĠ ĠSl ur p F wd Action (), ĠSl ur p B wd Action (), ĊĠĠĠĠĠĠĠĠĠ ĠBar f F wd Action (), ĠBar f B wd Action (), ĊĠĠĠĠĠĠĠĠĠ ĠSp lice Action (), ĠR ise Action (), ĊĠĠĠĠĠĠĠĠĠ ĠKill Action (), ĊĠĠĠĠĠĠĠĠĠ Ġaction Man . getAction ( Ide Actions . ACTION _ EDITOR _ BACK SPACE ), ĊĠĠĠĠĠĠĠĠĠ Ġaction Man . getAction ( Ide Actions . ACTION _ EDITOR _ DELETE )) ĊĠĠĠ Ġ} Ċ }