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 ])
world . entities [ id ] = entity
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
world . entities [ "N" ] . life_product = {}
world . entities [ "N" ] . product_per_year_type = "H"
world . entities [ "N" ] . product_per_year_amount = 10.0
world . entities [ "N" ] . auto = 0.0
world . state . amount . N = 1.0
return world
func dispose ( world ) -> void :
for entity in world . entities . values ():
entity . free ()
world . free ()
func run () -> void :
var world = fixture ()
var global : Node = root . get_node ( "Global" )
2026-09-16 19:54:47 +03:00
check ( global . CivilizationRules . size () == 44 , "Load all ethical civilization stages" )
2026-09-15 23:05:05 +03:00
for row : Dictionary in global . CivilizationRules . values ():
2026-09-16 19:54:47 +03:00
check ( row . ethics . size () == 6 or row . span == 0.0 , "Every ethical stage has six rules" )
2026-09-16 07:58:19 +03:00
world . state . amount . RD = 12.0
2026-09-15 23:05:05 +03:00
world . state . amount [ "C0.2" ] = 8.0
world . state . binds . RD = { "C2.0" : 12.0 , "C1.9" : 3.0 }
world . initialize_life_batches ()
check ( world . state . amount [ "C2.0" ] == 12.0 and world . state . binds . RD [ "C2.0" ] == 0.0 , "Old space civilizations detach without loss" )
check ( world . state . binds . RD [ "C1.9" ] == 3.0 , "Planetary civilizations retain their host" )
check ( world . state . ethics [ "C0.2" ] == { "m" : 2.0 , "l" : 2.0 , "w" : 1.0 , "d" : 1.0 , "c" : 1.0 , "b" : 1.0 }, "Migration uses equal ethics and deterministic remainder" )
check ( world . state . ethics [ "C2.0" ] . values () . all ( func ( n ): return n == 2.0 ), "Bound civilization ethics count physical population" )
var before : Dictionary = world . state . duplicate ( true )
world . initialize_life_batches ()
check ( world . state == before , "Repeated initialization preserves ethics" )
world . state . ethics [ "C0.2" ] = { "m" : 8.0 , "l" : 0.0 , "w" : 0.0 , "d" : 0.0 , "c" : 0.0 , "b" : 0.0 }
world . initialize_life_batches ()
check ( world . state . ethics [ "C0.2" ] . m == 8.0 , "Existing unequal distribution is retained" )
world . state . amount [ "C0.2" ] = 3.0
world . initialize_life_batches ()
check ( world . state . ethics [ "C0.2" ] . m == 3.0 , "Losses reduce ethics without inventing population" )
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 }) == "" , "Ethics state validates" )
2026-09-15 23:05:05 +03:00
var restored = fixture ()
restored . state = bytes_to_var ( var_to_bytes ( world . state ))
restored . initialize_life_batches ()
check ( restored . state == world . state , "Save roundtrip preserves ethics and ownership" )
dispose ( restored )
dispose ( world )
world = fixture ()
2026-09-16 07:58:19 +03:00
world . state . amount . RD = 10.0
2026-09-16 19:54:47 +03:00
for row : Dictionary in global . CivilizationRules [ "C1.9" ] . ethics . values ():
row . progress = "1"
row . degradation = "0"
row . colonization = "0"
2026-09-15 23:05:05 +03:00
world . state . binds . RD = { "C1.9" : 10.0 }
world . state . batches [ "C1.9" ] = [{ "amount" : 10.0 , "start_year" : 1.0 , "end_year" : 1.0 }]
world . _evolve_batches ( world . state , 1.0 )
check ( world . state . amount [ "C2.0" ] == 10.0 and world . state . binds . RD . get ( "C2.0" , 0.0 ) == 0.0 , "Space successor does not inherit planetary binding" )
dispose ( world )
2026-09-16 07:58:19 +03:00
var capacity = load ( "res://world/owniverse/civilization_state.gd" )
world = fixture ()
world . state . amount . RD = 10.0
world . state . amount [ "C2.0" ] = 8.0
var budget : Dictionary = capacity . stellar_budget ( world , world . state , global . CivilizationRules )
check ( capacity . admit_transition ( budget , global . CivilizationRules , "C1.9" , "C2.0" , 5.0 ) == 2.0 , "Growth consumes only remaining stellar capacity" )
check ( capacity . admit_transition ( budget , global . CivilizationRules , "C1.9" , "C2.0" , 5.0 ) == 0.0 , "A reservation cannot be spent twice" )
world . state . amount [ "C2.0" ] = 1.0
budget = capacity . stellar_budget ( world , world . state , global . CivilizationRules )
check ( capacity . admit_transition ( budget , global . CivilizationRules , "C2.0" , "C2.1" , 1.0 ) == 1.0 , "A transition reuses the source reservation" )
check ( budget . free . DwStar == 0.0 , "C2.1 reserves ten dwarf stars" )
world . state . amount [ "C2.0" ] = 0.0
world . state . binds . SC = { "RD" : 10.0 }
budget = capacity . stellar_budget ( world , world . state , global . CivilizationRules )
check ( budget . capacity . DwStar == 20.0 , "Stars inside structures are counted once" )
dispose ( world )
world = fixture ()
world . state . amount . RD = 12.0
world . state . amount [ "C2.1" ] = 2.0
world . state . amount [ "C2.0" ] = 5.0
world . initialize_life_batches ()
check ( world . state . amount [ "C2.1" ] == 1.0 and world . state . amount [ "C2.0" ] == 2.0 , "Shared budget supports advanced civilizations first" )
check ( world . state . binds . RD [ "C1.9" ] == 4.0 , "Excess cascades to supported planetary stage" )
var snapshot : Dictionary = world . state . duplicate ( true )
world . initialize_life_batches ()
check ( world . state == snapshot , "Capacity enforcement is idempotent" )
world . state . amount . RD = 0.0
world . initialize_life_batches ()
check ( world . state . amount [ "C2.1" ] == 0.0 and world . state . amount [ "C2.0" ] == 0.0 , "Vanished stars force all unsupported space civilizations down" )
check ( world . _physical_amounts ( world . state )[ "C1.9" ] == 7.0 , "Forced degradation conserves civilizations" )
dispose ( world )
world = fixture ()
2026-09-16 19:54:47 +03:00
world . state . amount . LGW = 20.0
2026-09-16 07:58:19 +03:00
world . state . amount . SMBH = 2.0e22
world . state . amount [ "C4.2" ] = 3.0
world . initialize_life_batches ()
check ( world . state . amount [ "C4.2" ] == 2.0 , "SMBH capacity uses stellar mass equivalent" )
check ( world . _physical_amounts ( world . state )[ "C1.9" ] == 1.0 , "Unsupported civilization degrades through missing habitat families" )
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 }) == "" , "Capacity-limited state validates" )
2026-09-16 07:58:19 +03:00
dispose ( world )
world = fixture ()
world . state . amount . RD = 2.0
2026-09-16 19:54:47 +03:00
for row : Dictionary in global . CivilizationRules [ "C1.9" ] . ethics . values ():
row . progress = "1"
row . degradation = "0"
row . colonization = "0"
2026-09-16 07:58:19 +03:00
world . state . binds . RD = { "C1.9" : 5.0 }
world . state . batches [ "C1.9" ] = [{ "amount" : 5.0 , "start_year" : 1.0 , "end_year" : 1.0 }]
world . _evolve_batches ( world . state , 1.0 )
check ( world . state . amount [ "C2.0" ] == 2.0 and world . state . binds . RD [ "C1.9" ] == 3.0 , "Unfunded transition retains the original planetary civilization" )
dispose ( world )
2026-09-15 23:05:05 +03:00
print ( "Civilization state: %d checks, %d failures" % [ checks , failures ])
quit ( 0 if failures == 0 else 1 )