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)