2026-09-15 23:05:05 +03:00
extends SceneTree
const Clock = preload ( "res://world/owniverse/simulation_time.gd" )
var checks : int = 0
var failures : int = 0
func _initialize () -> void :
call_deferred ( "run" )
func check ( condition : bool , message : String ) -> void :
checks += 1
if not condition :
failures += 1
push_error ( message )
func fixture ():
var world = load ( "res://world/owniverse/owniverse.gd" ) . new ()
var global : Node = root . get_node ( "Global" )
for id in global . OwniverseEntities :
var entity = load ( "res://world/owniverse/owniverse_entity.gd" ) . new ( global . OwniverseEntities [ id ])
2026-09-29 20:23:20 +03:00
world . catalog . entities [ id ] = entity
2026-09-15 23:05:05 +03:00
world . state . amount [ id ] = 0.0
world . state . stats . total_amount [ id ] = 0.0
if entity . group_as != "" :
world . state . amount [ entity . group_as ] = 0.0
world . state . stats . total_amount [ entity . group_as ] = 0.0
2026-09-29 20:23:20 +03:00
world . catalog . entities [ "N" ] . life_product = {}
world . catalog . entities [ "N" ] . product_per_year_type = "H"
world . catalog . entities [ "N" ] . product_per_year_amount = 10.0
world . catalog . entities [ "N" ] . auto = 0.0
2026-09-15 23:05:05 +03:00
world . state . amount . N = 1.0
return world
func dispose ( world ) -> void :
2026-09-29 20:23:20 +03:00
for entity in world . catalog . entities . values ():
2026-09-15 23:05:05 +03:00
entity . free ()
world . free ()
func run () -> void :
var world = fixture ()
world . state . amount . N = 0.0
world . state . amount . HP = 40000.0
2026-09-29 20:23:20 +03:00
world . evolution . initialize_life_batches ()
2026-09-15 23:05:05 +03:00
check ( world . state . batches . HP . size () == 1 , "Old HP receives life cohort" )
check ( world . state . batches . HP [ 0 ] . start_year == 5e6 , "HP uses source span" )
var before : Dictionary = world . state . duplicate ( true )
2026-09-29 20:23:20 +03:00
world . evolution . initialize_life_batches ()
2026-09-15 23:05:05 +03:00
check ( world . state == before , "Initialization is idempotent" )
2026-09-29 20:23:20 +03:00
world . evolution . evolve_batches ( world . state , 5e6 + 5e6 / 40.0 )
2026-09-15 23:05:05 +03:00
check ( world . state . amount . EON1 == 10.0 , "HP abiogenesis follows source probability" )
check ( world . state . amount . RP == 100.0 , "HP degradation produces RP" )
check ( world . state . amount . HP == 39890.0 , "Unchanged planets retry, not disappear" )
check ( world . state . stats . total_amount . HP == 0.0 , "Retry does not inflate creation statistics" )
check ( world . state . batches . HP . size () > 0 , "Survivors get next attempt" )
2026-09-29 20:23:20 +03:00
var physical : Dictionary = world . ledger . physical_amounts ( world . state )
2026-09-15 23:05:05 +03:00
check ( physical . HP + physical . EON1 + physical . RP == 40000.0 , "Life conserves planets" )
2026-09-20 20:56:15 +03:00
check ( root . get_node ( "SaveManager" ) . validate_data ({ "format_version" : 2 , "app_version" : "" , "ui" : { "current_page" : 0 }, "state" : world . state }) == "" , "Life save validates" )
2026-09-15 23:05:05 +03:00
var restored = fixture ()
restored . state = bytes_to_var ( var_to_bytes ( world . state ))
2026-09-29 20:23:20 +03:00
world . evolution . evolve_batches ( world . state , 11e6 )
restored . evolution . evolve_batches ( restored . state , 11e6 )
2026-09-15 23:05:05 +03:00
check ( world . state == restored . state , "Life continuation preserves cohorts and carries" )
dispose ( restored )
dispose ( world )
world = fixture ()
world . state . amount . RD = 1.0
world . state . binds . RD = { "EON5" : 40000.0 }
2026-09-29 20:23:20 +03:00
world . evolution . initialize_life_batches ()
world . evolution . evolve_batches ( world . state , 5e5 + 5e5 / 40.0 )
2026-09-15 23:05:05 +03:00
check ( world . state . binds . RD [ "C0.0" ] == 10.0 , "Intelligence emerges at the same host star" )
check ( world . state . amount [ "C0.0" ] == 0.0 , "Life transition keeps planet bound" )
check ( world . state . batches . has ( "C0.0" ), "New C0.0 starts civilization evolution" )
dispose ( world )
world = fixture ()
var progress : float = 0.0
var degraded : float = 0.0
var valid_outcomes : bool = true
for i in 4001 :
2026-09-29 20:23:20 +03:00
var products : Dictionary = world . life . life_products ( world . state , world . catalog . entities . HP , 1.0 )
2026-09-15 23:05:05 +03:00
var total : float = 0.0
for value in products . values ():
total += value
valid_outcomes = valid_outcomes and value >= 0.0 and value == floorf ( value )
valid_outcomes = valid_outcomes and total == 1.0
progress += products . get ( "EON1" , 0.0 )
degraded += products . get ( "RP" , 0.0 )
check ( valid_outcomes , "Every single-planet attempt has whole outcomes and conserves population" )
check ( progress == 1.0 and degraded == 10.0 , "Rare outcomes accumulate deterministically" )
dispose ( world )
world = fixture ()
world . state . time = { "datetime" : 123.4 , "year" : 123.4 }
world . state . binds . RD = { "HP" : 2.0 }
2026-09-29 20:23:20 +03:00
world . evolution . initialize_life_batches ()
2026-09-15 23:05:05 +03:00
check ( world . state . batches . HP [ 0 ] . created_from == 123.4 , "Old bound worlds begin life at load time" )
2026-09-29 20:23:20 +03:00
world . stellar . destroy_planets ( world . state , "RD" , 1.0 , 1 )
world . evolution . evolve_batches ( world . state , 1e7 )
check ( world . ledger . physical_amounts ( world . state ) . HP == 0.0 and world . state . binds . RD . RP == 2.0 , "Destroyed life does not resurrect from cohort" )
2026-09-15 23:05:05 +03:00
dispose ( world )
world = fixture ()
world . state . time = { "datetime" : 123.4 , "year" : 123.4 }
world . state . amount [ "C0.0" ] = 40000.0
2026-09-29 20:23:20 +03:00
world . evolution . initialize_life_batches ()
2026-09-20 20:56:15 +03:00
check ( world . state . batches [ "C0.0" ][ 0 ] . created_from == 123.4 , "Civilization cohorts begin at the current time" )
2026-09-15 23:05:05 +03:00
before = world . state . duplicate ( true )
2026-09-29 20:23:20 +03:00
world . evolution . initialize_life_batches ()
2026-09-20 20:56:15 +03:00
check ( world . state == before , "Life batch initialization is idempotent" )
2026-09-29 20:23:20 +03:00
world . evolution . evolve_batches ( world . state , 2173.4 )
2026-09-15 23:05:05 +03:00
check ( world . state . amount [ "C0.1" ] == 700.0 and world . state . amount . EON5 == 1000.0 , "C0.0 progresses and degrades by Unity rates" )
check ( world . state . amount [ "C0.0" ] == 38300.0 , "C0.0 remainder stays alive" )
dispose ( world )
world = fixture ()
world . state . amount . RD = 1.0
world . state . binds . RD = { "C0.1" : 40000.0 }
2026-09-29 20:23:20 +03:00
world . evolution . initialize_life_batches ()
world . evolution . evolve_batches ( world . state , 2050.0 )
2026-09-15 23:05:05 +03:00
check ( world . state . binds . RD [ "C0.2" ] == 700.0 , "C0.1 reaches ethical civilization without losing host" )
check ( world . state . binds . RD [ "C0.0" ] == 1000.0 , "C0.1 degradation follows Unity" )
2026-09-20 20:56:15 +03:00
check ( root . get_node ( "SaveManager" ) . validate_data ({ "format_version" : 2 , "app_version" : "" , "ui" : { "current_page" : 0 }, "state" : world . state }) == "" , "Extended life save validates" )
2026-09-15 23:05:05 +03:00
dispose ( world )
print ( "Life: %d checks, %d failures" % [ checks , failures ])
quit ( 0 if failures == 0 else 1 )