package Ġx . domain persistence modeling . parent Ċ Ċ import Ġch . tut tel i . at rium . api . cc . en _ GB . contains Exactly Ċ import Ġch . tut tel i . at rium . api . cc . en _ GB . has Size Ċ import Ġch . tut tel i . at rium . api . cc . en _ GB . isEmpty Ċ import Ġch . tut tel i . at rium . api . cc . en _ GB . isNotEmpty Ċ import Ġch . tut tel i . at rium . api . cc . en _ GB . toBe Ċ import Ġch . tut tel i . at rium . api . cc . en _ GB . toThrow Ċ import Ġch . tut tel i . at rium . ver bs . expect Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġx . domain persistence modeling . Domain Exception Ċ import Ġx . domain persistence modeling . Known State . ENABLED Ċ import Ġx . domain persistence modeling . Live TestBase Ċ import Ġx . domain persistence modeling . Persist able Domain . Up sert ed Domain Result Ċ import Ġx . domain persistence modeling . a Child Changed Event Ċ import Ġx . domain persistence modeling . a Parent Changed Event Ċ import Ġx . domain persistence modeling . at Zero Ċ import Ġx . domain persistence modeling . other Natural Id Ċ import Ġx . domain persistence modeling . parent Natural Id Ċ Ċ internal Ġclass ĠPers isted Parents Test ĊĠĠĠ Ġ: ĠLive TestBase () Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġcreate Ġnew `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfound Ġ= Ġparents . find Existing OrCreate New ( parent Natural Id ) ĊĊĠĠĠĠĠĠĠ Ġexpect ( found ). toBe ( new Un saved Parent ()) ĊĠĠĠĠĠĠĠ Ġexpect ( found . children ). isEmpty () ĊĊĠĠĠĠĠĠĠ Ġexpect Sql Query Count sBy Type ( select Ġ= Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġexpect Domain Changed Events (). isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġfind Ġexisting `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsaved Ġ= Ġnew Saved Parent () ĊĊĠĠĠĠĠĠĠ Ġval Ġfound Ġ= Ġparents . find Existing OrCreate New ( parent Natural Id ) ĊĊĠĠĠĠĠĠĠ Ġexpect ( found ). toBe ( saved ) ĊĠĠĠĠĠĠĠ Ġexpect ( found . children ). isEmpty () ĊĊĠĠĠĠĠĠĠ Ġ// Ġ# 1 Ġ== Ġparent , Ġ# 2 Ġ== Ġother Ġ( none ), Ġ# 3 Ġ== Ġchildren Ġ( none ) ĊĠĠĠĠĠĠĠ Ġexpect Sql Query Count sBy Type ( select Ġ= Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġexpect Domain Changed Events (). isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġround Ġtrip `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġun saved Ġ= Ġnew Un saved Parent () ĊĊĠĠĠĠĠĠĠ Ġexpect ( un saved . version ). toBe ( 0 ) ĊĠĠĠĠĠĠĠ Ġexpect Sql Queries (). isEmpty () ĊĠĠĠĠĠĠĠ Ġexpect Domain Changed Events (). isEmpty () ĊĊĠĠĠĠĠĠĠ Ġval Ġsaved Ġ= Ġun saved . save () ĊĊĠĠĠĠĠĠĠ Ġexpect Sql Query Count sBy Type ( upsert Ġ= Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġexpect All Parents (). has Size ( 1 ) ĊĠĠĠĠĠĠĠ Ġexpect ( un saved . version ). toBe ( 1 ) ĊĠĠĠĠĠĠĠ Ġexpect ( saved ). toBe ( Up sert ed Domain Result ( un saved , Ġtrue )) ĊĠĠĠĠĠĠĠ Ġexpect ( current Pers isted Parent ()). toBe ( saved . domain ) ĊĊĠĠĠĠĠĠĠ Ġexpect Domain Changed Events (). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Parent Changed Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno Before Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Version Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġdetect Ġno Ġchanges `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Ġ= Ġnew Saved Parent () ĊĠĠĠĠĠĠĠ Ġval Ġres aved Ġ= Ġoriginal . save () ĊĊĠĠĠĠĠĠĠ Ġexpect ( res aved ). toBe ( Up sert ed Domain Result ( original , Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġexpect Sql Queries (). isEmpty () ĊĠĠĠĠĠĠĠ Ġexpect Domain Changed Events (). isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġmutate `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Ġ= Ġnew Saved Parent () ĊĊĠĠĠĠĠĠĠ Ġexpect ( original . changed ). toBe ( false ) ĊĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġ" FUN KY " ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġ" FO OB AR " ĊĠĠĠĠĠĠĠ Ġval Ġside Value Ġ= Ġ" ABC " ĊĠĠĠĠĠĠĠ Ġoriginal . update Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ= Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . side Values Ġ+= Ġ" FOO " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . side Values Ġ+= Ġside Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . side Values Ġ-= Ġ" FOO " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpect ( original . changed ). toBe ( true ) ĊĠĠĠĠĠĠĠ Ġexpect ( original . state ). toBe ( state ) ĊĠĠĠĠĠĠĠ Ġexpect ( original . value ). toBe ( value ) ĊĠĠĠĠĠĠĠ Ġexpect ( original . side Values ). contains Exactly ( side Value ) ĊĊĠĠĠĠĠĠĠ Ġexpect Sql Queries (). isEmpty () ĊĠĠĠĠĠĠĠ Ġexpect Domain Changed Events (). isEmpty () ĊĊĠĠĠĠĠĠĠ Ġoriginal . save () ĊĊĠĠĠĠĠĠĠ Ġexpect Sql Query Count sBy Type ( upsert Ġ= Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġexpect ( original . changed ). toBe ( false ) ĊĊĠĠĠĠĠĠĠ Ġexpect Domain Changed Events (). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Parent Changed Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Version Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore State Ġ= ĠENABLE D . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Value Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Side Values Ġ= Ġset Of (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Version Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter State Ġ= Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Value Ġ= Ġvalue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Side Values Ġ= Ġset Of ( side Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġmutate Ġchildren `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġnew Saved Parent () ĊĊĠĠĠĠĠĠĠ Ġexpect ( parent . due ). toBe ( null ) ĊĊĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġnew Saved Un assigned Child () ĊĊĠĠĠĠĠĠĠ Ġparent . assign ( child ) ĊĊĠĠĠĠĠĠĠ Ġexpect ( parent . due ). toBe ( child . at ) ĊĊĠĠĠĠĠĠĠ Ġval Ġat Ġ= Ġat Zero . plus Days ( 1 L ) ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġ" FO OB AR " ĊĠĠĠĠĠĠĠ Ġparent . update Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . update Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . at Ġ= Ġat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġparent . save () ĊĊĠĠĠĠĠĠĠ Ġexpect Sql Query Count sBy Type ( select Ġ= Ġ 1 , Ġupsert Ġ= Ġ 2 ) ĊĊĠĠĠĠĠĠĠ Ġexpect ( current Pers isted Child (). at ). toBe ( at ) ĊĠĠĠĠĠĠĠ Ġexpect ( current Pers isted Child (). value ). toBe ( value ) ĊĠĠĠĠĠĠĠ Ġexpect ( current Pers isted Parent (). due ). toBe ( at ) ĊĊĠĠĠĠĠĠĠ Ġexpect Domain Changed Events (). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Child Changed Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Version Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Parent Natural Id Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore At Ġ= Ġat Zero , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Value Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Version Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Parent Natural Id Ġ= Ġparent Natural Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter At Ġ= Ġat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Parent Changed Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Version Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Due Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Version Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Due Ġ= Ġat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġdelete `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexisting Ġ= Ġnew Saved Parent () ĊĊĠĠĠĠĠĠĠ Ġexisting . delete () ĊĊĠĠĠĠĠĠĠ Ġexpect Sql Query Count sBy Type ( delete Ġ= Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġexpect All Parents (). isEmpty () ĊĠĠĠĠĠĠĠ Ġexpect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexisting . version ĊĠĠĠĠĠĠĠ Ġ}. toThrow < Domain Exception > Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpect Domain Changed Events (). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Parent Changed Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Version Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno After Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġnot Ġdelete `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġnew Saved Parent () ĊĠĠĠĠĠĠĠ Ġval Ġun assigned Ġ= Ġnew Saved Un assigned Child () ĊĊĠĠĠĠĠĠĠ Ġparent . assign ( un assigned ) ĊĊĠĠĠĠĠĠĠ Ġexpect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . delete () ĊĠĠĠĠĠĠĠ Ġ}. toThrow < Domain Exception > Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpect Sql Queries (). isEmpty () ĊĠĠĠĠĠĠĠ Ġexpect Domain Changed Events (). isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġsort Ġby Ġnatural Ġid `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġparents . find Existing OrCreate New ( parent Natural Id ) ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġparents . find Existing OrCreate New ( parent Natural Id Ġ+ Ġ" X ") ĊĠĠĠĠĠĠĠ Ġval Ġset Ġ= Ġsorted Set Of < Parent >() ĊĊĠĠĠĠĠĠĠ Ġset Ġ+= Ġb ĊĠĠĠĠĠĠĠ Ġset Ġ+= Ġa ĊĊĠĠĠĠĠĠĠ Ġexpect Sql Queries (). isNotEmpty () ĊĠĠĠĠĠĠĠ Ġexpect ( set ). contains Exactly ( a , Ġb ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġrevert Ġon Ġfailed Ġdelete `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexisting Ġ= Ġnew Saved Parent () ĊĊĠĠĠĠĠĠĠ Ġprogram mable Listener . fail Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġexpect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexisting . delete () ĊĠĠĠĠĠĠĠ Ġ}. toThrow < Domain Exception > Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpect Sql Query Count sBy Type ( delete Ġ= Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġtest Listener . reset () Ġ// ĠOrder Ġof Ġlisteners Ġnot Ġpredict able ĊĠĠĠĠĠĠĠ Ġexpect ( existing . changed ). toBe ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġsort Ġside Ġvalues `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġnew Un saved Parent () ĊĠĠĠĠĠĠĠ Ġval Ġout Of Order Ġ= ĠlistOf (" DEF ", Ġ" ABC ") ĊĊĠĠĠĠĠĠĠ Ġparent . update Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġside Values Ġ+= Ġout Of Order ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpect ( parent . side Values ). toBe ( out Of Order . to Sorted Set ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġnot Ġassign Ġalready Ġassigned Ġchild `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġnew Saved Parent () ĊĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġnew Saved Un assigned Child () ĊĊĠĠĠĠĠĠĠ Ġparent . assign ( child ) ĊĊĠĠĠĠĠĠĠ Ġexpect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . assign ( child ) ĊĠĠĠĠĠĠĠ Ġ}. toThrow < Domain Exception > Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpect Sql Queries (). isEmpty () ĊĠĠĠĠĠĠĠ Ġexpect Domain Changed Events (). isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġassign Ġand Ġun assign Ġchild `() Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġparent Ġ= Ġnew Saved Parent () ĊĠĠĠĠĠĠĠ Ġval Ġun assigned Ġ= Ġnew Saved Un assigned Child () ĊĊĠĠĠĠĠĠĠ Ġexpect ( parent . children ). isEmpty () ĊĠĠĠĠĠĠĠ Ġexpect ( un assigned . assigned ). toBe ( false ) ĊĊĠĠĠĠĠĠĠ Ġval Ġassigned Ġ= Ġparent . assign ( un assigned ) ĊĊĠĠĠĠĠĠĠ Ġexpect ( parent . children ). contains Exactly ( assigned ) ĊĠĠĠĠĠĠĠ Ġexpect ( assigned . assigned ). toBe ( true ) ĊĊĠĠĠĠĠĠĠ Ġparent Ġ= Ġparent . save (). domain ĊĊĠĠĠĠĠĠĠ Ġexpect Sql Query Count sBy Type ( select Ġ= Ġ 1 , Ġupsert Ġ= Ġ 2 ) ĊĊĠĠĠĠĠĠĠ Ġexpect ( parent . version ). toBe ( 2 ) ĊĠĠĠĠĠĠĠ Ġexpect ( current Pers isted Child (). parent Natural Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toBe ( parent Natural Id ) ĊĊĠĠĠĠĠĠĠ Ġexpect Domain Changed Events (). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Child Changed Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Version Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Parent Natural Id Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Version Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Parent Natural Id Ġ= Ġparent Natural Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Parent Changed Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Version Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Due Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Version Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Due Ġ= Ġat Zero ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġparent . un assign ( assigned ) ĊĠĠĠĠĠĠĠ Ġparent Ġ= Ġparent . save (). domain ĊĊĠĠĠĠĠĠĠ Ġexpect Sql Query Count sBy Type ( select Ġ= Ġ 1 , Ġupsert Ġ= Ġ 2 ) ĊĊĠĠĠĠĠĠĠ Ġexpect ( parent . children ). isEmpty () ĊĠĠĠĠĠĠĠ Ġexpect ( parent . version ). toBe ( 3 ) ĊĠĠĠĠĠĠĠ Ġexpect ( current Pers isted Child (). parent Natural Id ). toBe ( null ) ĊĠĠĠĠĠĠĠ Ġexpect ( assigned . assigned ). toBe ( false ) ĊĊĠĠĠĠĠĠĠ Ġexpect Domain Changed Events (). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Child Changed Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Version Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Parent Natural Id Ġ= Ġparent Natural Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Version Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Parent Natural Id Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Parent Changed Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Version Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Due Ġ= Ġat Zero , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Version Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Due Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġpersist Ġmut ated Ġbut Ġun assigned Ġchildren `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġnew Saved Parent () ĊĠĠĠĠĠĠĠ Ġval Ġun assigned Ġ= Ġnew Saved Un assigned Child () ĊĠĠĠĠĠĠĠ Ġval Ġassigned Ġ= Ġparent . assign ( un assigned ) ĊĊĠĠĠĠĠĠĠ Ġparent . save () ĊĊĠĠĠĠĠĠĠ Ġexpect Sql Query Count sBy Type ( select Ġ= Ġ 1 , Ġupsert Ġ= Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġexpect Domain Changed Events (). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Child Changed Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Version Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Parent Natural Id Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Version Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Parent Natural Id Ġ= Ġparent Natural Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Parent Changed Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Version Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Due Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Version Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Due Ġ= Ġat Zero ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġ" P QR " ĊĠĠĠĠĠĠĠ Ġun assigned . update Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . value Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġparent . un assign ( assigned ) ĊĠĠĠĠĠĠĠ Ġparent . delete () ĊĊĠĠĠĠĠĠĠ Ġexpect ( current Pers isted Child (). value ). toBe ( value ) ĊĊĠĠĠĠĠĠĠ Ġexpect Sql Queries (). isEmpty () ĊĠĠĠĠĠĠĠ Ġexpect Domain Changed Events (). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Child Changed Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Version Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Parent Natural Id Ġ= Ġparent Natural Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Value Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Version Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Parent Natural Id Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Parent Changed Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Version Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Due Ġ= Ġat Zero , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno After Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġassign Ġand Ġun assign Ġother `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġnew Saved Parent () ĊĠĠĠĠĠĠĠ Ġval Ġother Ġ= Ġnew Saved Other () ĊĊĠĠĠĠĠĠĠ Ġparent . assign ( other ) ĊĠĠĠĠĠĠĠ Ġparent . save () ĊĊĠĠĠĠĠĠĠ Ġexpect Sql Query Count sBy Type ( select Ġ= Ġ 1 , Ġupsert Ġ= Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġexpect ( current Pers isted Parent (). other ). toBe ( other ) ĊĊĠĠĠĠĠĠĠ Ġexpect Domain Changed Events (). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Parent Changed Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Version Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Other Natural Id Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Version Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Other Natural Id Ġ= Ġother Natural Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġparent . un assign Any Other () ĊĠĠĠĠĠĠĠ Ġparent . save () ĊĊĠĠĠĠĠĠĠ Ġexpect Sql Query Count sBy Type ( select Ġ= Ġ 1 , Ġupsert Ġ= Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġexpect ( current Pers isted Parent (). other ). toBe ( null ) ĊĊĠĠĠĠĠĠĠ Ġexpect Domain Changed Events (). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Parent Changed Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Version Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Other Natural Id Ġ= Ġother Natural Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Version Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Other Natural Id Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġinherit Ġ" at " Ġfrom Ġchildren `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġnew Un saved Un assigned Child () ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġnew Un saved Parent () ĊĊĠĠĠĠĠĠĠ Ġval Ġdue Ġ= Ġat Zero . plus Days ( 1 L ) ĊĠĠĠĠĠĠĠ Ġchild . update Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġat Ġ= Ġdue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġparent . assign ( child ) ĊĊĠĠĠĠĠĠĠ Ġparent . update Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( this . due ). toBe ( due ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpect ( parent . due ). toBe ( due ) ĊĠĠĠ Ġ} Ċ } Ċ