53 lines
2.7 KiB
GDScript
53 lines
2.7 KiB
GDScript
|
|
extends SceneTree
|
||
|
|
const E = preload("res://world/owniverse/math/exact.gd")
|
||
|
|
var checks: int = 0
|
||
|
|
var failures: int = 0
|
||
|
|
func _initialize(): call_deferred("run")
|
||
|
|
func check(value: bool, message: String):
|
||
|
|
checks += 1
|
||
|
|
if not value:
|
||
|
|
failures += 1
|
||
|
|
push_error(message)
|
||
|
|
func run():
|
||
|
|
var world = load("res://world/owniverse/owniverse.gd").new()
|
||
|
|
world.catalog.load_definitions(root.get_node("Global").OwniverseEntities)
|
||
|
|
world.catalog.entities.N.lifespan = 24
|
||
|
|
var width: Variant = E.divide(24, root.get_node("Global").batch_count)
|
||
|
|
for count in [1, 2, 7, 11, 100, E.of("1e40")]:
|
||
|
|
for interval in [[E.of("0.25"), E.of("101.75")], [0, 120], [3, 3]]:
|
||
|
|
world.state.batches = {}
|
||
|
|
world.state.batch_origins = {"N": E.of("0.125")}
|
||
|
|
var expected: Array = []
|
||
|
|
var origin: Variant = world.state.batch_origins.N
|
||
|
|
var index: Variant = E.floor_value(E.divide(E.subtract(interval[0], origin), width))
|
||
|
|
var assigned: Variant = 0
|
||
|
|
var cursor: Variant = interval[0]
|
||
|
|
while true:
|
||
|
|
var start: Variant = E.add(origin, E.multiply(index, width))
|
||
|
|
var end: Variant = E.add(origin, E.multiply(E.add(index, 1), width))
|
||
|
|
if E.le(end, cursor):
|
||
|
|
index = E.add(index, 1)
|
||
|
|
continue
|
||
|
|
var until: Variant = E.minimum(interval[1], end)
|
||
|
|
var amount: Variant = E.subtract(count, assigned)
|
||
|
|
if E.gt(interval[1], interval[0]) and E.lt(until, interval[1]):
|
||
|
|
amount = E.subtract(E.floor_value(E.mul_div(count, E.subtract(until, interval[0]), E.subtract(interval[1], interval[0]))), assigned)
|
||
|
|
if E.gt(amount, 0):
|
||
|
|
expected.append({"created_from": start, "created_to": end, "start_year": E.add(start, 24), "end_year": E.add(end, 24), "amount": amount})
|
||
|
|
assigned = E.add(assigned, amount)
|
||
|
|
if E.ge(until, interval[1]): break
|
||
|
|
cursor = end
|
||
|
|
index = E.add(index, 1)
|
||
|
|
world.batches.append_batch(world.state, "N", count, interval[0], interval[1])
|
||
|
|
var actual: Array = []
|
||
|
|
for batch in world.state.batches.N:
|
||
|
|
if E.gt(batch.amount, 0): actual.append(batch)
|
||
|
|
check(E.eq(actual, expected), "Sparse jump preserves every nonempty quota and boundary")
|
||
|
|
var total: Variant = 0
|
||
|
|
for batch in actual: total = E.add(total, batch.amount)
|
||
|
|
check(E.eq(total, count), "Sparse jump preserves complete whole population")
|
||
|
|
for entity in world.catalog.entities.values(): entity.free()
|
||
|
|
world.free()
|
||
|
|
print("Sparse batches: %d checks, %d failures" % [checks, failures])
|
||
|
|
quit(1 if failures else 0)
|