/* Ċ Ġ* ĠCopyright ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . ĠAll ĠRights ĠReserved . Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 . Ċ Ġ*/ Ċ Ċ package Ġsoftware . amazon . smithy . rust . codegen . smithy . transformers Ċ Ċ import Ġio . kot est . matchers . shouldBe Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġsoftware . amazon . smithy . model . shapes . Member Shape Ċ import Ġsoftware . amazon . smithy . rust . codegen . smithy . Rust Box Trait Ċ import Ġsoftware . amazon . smithy . rust . codegen . testutil . as Sm ithy Model Ċ import Ġsoftware . amazon . smithy . rust . codegen . util . expect Trait Ċ import Ġsoftware . amazon . smithy . rust . codegen . util . has Trait Ċ import Ġsoftware . amazon . smithy . rust . codegen . util . lookup Ċ import Ġkotlin . streams . toList Ċ Ċ internal Ġclass ĠRecursive Shape Box er Test Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` leave Ġnon - recursive Ġmodels Ġunchanged `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnamespace Ġcom . example ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist ĠBar List Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmember : ĠBar ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstructure ĠHello Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbars : ĠBar List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstructure ĠBar Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhello : ĠHello ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ""" . as Sm ithy Model () ĊĠĠĠĠĠĠĠ ĠRecursive Shape Box er . transform ( model ) ĠshouldBe Ġmodel ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` add Ġthe Ġbox Ġtrait Ġto Ġsimple Ġrecursive Ġshapes `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnamespace Ġcom . example ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstructure ĠRecursive Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecursive Struct : ĠRecursive , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanother Field : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ""" . as Sm ithy Model () ĊĠĠĠĠĠĠĠ Ġval Ġtransformed Ġ= ĠRecursive Shape Box er . transform ( model ) ĊĠĠĠĠĠĠĠ Ġval Ġmember : ĠMember Shape Ġ= Ġtransformed . lookup (" com . example # Recursive \$ Recursive Struct ") ĊĠĠĠĠĠĠĠ Ġmember . expect Trait < Rust Box Trait >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` add Ġthe Ġbox Ġtrait Ġto Ġcomplex Ġstructures `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnamespace Ġcom . example ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstructure ĠExpr Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft : ĠAtom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright : ĠAtom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġunion ĠAtom Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd : ĠExpr , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub : ĠExpr , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġliteral : ĠInteger , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmore : ĠSecond Tree ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstructure ĠSecond Tree Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmember : ĠExpr , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Member : ĠAtom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthird : ĠSecond Tree ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ""" . as Sm ithy Model () ĊĠĠĠĠĠĠĠ Ġval Ġtransformed Ġ= ĠRecursive Shape Box er . transform ( model ) ĊĠĠĠĠĠĠĠ Ġval Ġbox ed Ġ= Ġtransformed . shapes (). filter Ġ{ Ġit . has Trait < Rust Box Trait >() Ġ}. toList () ĊĠĠĠĠĠĠĠ Ġbox ed . map Ġ{ Ġit . id . toString (). remove Prefix (" com . example # ") Ġ}. toSet () ĠshouldBe Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Atom \$ add ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Atom \$ sub ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Second Tree \$ third ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Atom \$ more " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ