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'); });