newInstanceWithoutConstructor();
$repair->method = SPIKE_METHOD_STDDEV;
$repair->out_start = 150;
$repair->out_end = 250;
$repair->stddev = 2;
foreach (['ds_min' => [$minimum], 'ds_max' => [$maximum]] as $name => $value) {
(new ReflectionProperty(spikekill::class, $name))->setValue($repair, $value);
}
$statistics = [[['sumofsamples' => 1020, 'numsamples' => 3]]];
$samples = [[[100 => '10', 200 => '1000', 225 => 'NaN', 300 => '10', 400 => 'NaN']]];
(new ReflectionMethod(spikekill::class, 'calculateOverallStatistics'))->invokeArgs($repair, [&$statistics, &$samples]);
expect($statistics[0][0]['average'])->toEqual(10)
->and($statistics[0][0]['stddev'])->toEqual(0)
->and($statistics[0][0]['min_cutoff'])->toEqual(10)
->and($statistics[0][0]['max_cutoff'])->toEqual(10)
->and($statistics[0][0]['stddev_killed'])->toBe(1);
})->with([[0, 10000], ['NaN', 'NaN']]);
test('absolute repair carries the last valid value separately for each data source', function () {
$repair = (new ReflectionClass(spikekill::class))->newInstanceWithoutConstructor();
$repair->method = SPIKE_METHOD_ABSOLUTE;
$repair->avgnan = 'last';
$repair->absmax = 100;
$repair->out_start = 150;
$repair->out_end = 350;
$output = [
'100100
',
'2001000500
',
'300205
',
'325NaNNaN
',
'4002000500
',
];
$statistics = [];
$repaired = (new ReflectionMethod(spikekill::class, 'updateXML'))->invokeArgs($repair, [&$output, &$statistics]);
$xml = simplexml_load_string('' . implode('', $repaired) . '');
expect((string) $xml->row[1]->v[0])->toBe(' 10')
->and((string) $xml->row[1]->v[1])->toBe(' 0')
->and((string) $xml->row[2]->v[0])->toBe(' 20')
->and((string) $xml->row[3]->v[0])->toBe(' NaN')
->and((string) $xml->row[4]->v[0])->toBe(' 2000');
});
test('deviation correction preserves unknown samples', function () {
$repair = (new ReflectionClass(spikekill::class))->newInstanceWithoutConstructor();
$repair->method = SPIKE_METHOD_STDDEV;
$repair->avgnan = 'last';
$repair->numspike = 10;
$output = [
'10010
',
'200NaN
',
'3001000
',
];
$statistics = [[['min_cutoff' => 5, 'max_cutoff' => 15]]];
$repaired = (new ReflectionMethod(spikekill::class, 'updateXML'))->invokeArgs($repair, [&$output, &$statistics]);
$xml = simplexml_load_string('' . implode('', $repaired) . '');
expect((string) $xml->row[1]->v)->toBe(' NaN')
->and((string) $xml->row[2]->v)->toBe(' 10');
});