import type { TestResult } from './perf-tests'
import type { ReactiveFramework } from './reactive-framework'

/** Parameters for a running a performance benchmark test
 *
 * The benchmarks create a rectangular grid of reactive elements, with
 * mutable signals in the first level, computed elements in the middle levels,
 * and read effect elements in the last level.
 *
 * Each test iteration modifies one signal, and then reads specified
 * fraction of the effect elements.
 *
 * Each non-signal node sums values from a specified number of elements
 * in the preceding layer. Some nodes are dynamic, and read vary
 * the number of sources the read for the sum.
 *
 * Tests may optionally provide result values to verify the sum
 * of all read effect elements in all iterations, and the total
 * number of non-signal updated.
 */
export interface TestConfig {
	/** friendly name for the test, should be unique */
	name?: string

	/** width of dependency graph to construct */
	width: number

	/** depth of dependency graph to construct */
	totalLayers: number

	/** fraction of nodes that are static */ // TODO change to dynamicFraction
	staticFraction: number

	/** construct a graph with number of sources in each node */
	nSources: number

	/** fraction of [0, 1] elements in the last layer from which to read values in each test iteration */
	readFraction: number

	/** number of test iterations */
	iterations: number

	/** sum and count of all iterations, for verification */
	expected: Partial<TestResult>
}

export interface FrameworkInfo {
	/** wrapper/adapter for a benchmarking a reactive framework */
	framework: ReactiveFramework

	/** verify the number of nodes executed matches the expected number */
	testPullCounts?: boolean
}
