You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

263 lines
7.1 KiB

<?php
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
function wikiplugin_fitnesse_info()
{
return [
'name' => tra('Fitnesse Test Suite'),
'documentation' => 'PluginFitnesse',
'description' => tra('Create test suites for applications built using Tiki'),
'prefs' => ['wikiplugin_fitnesse'],
'default' => 'n',
'format' => 'wiki',
'body' => tra('Test execution scenario'),
'filter' => 'wikicontent',
'iconname' => 'pencil',
'introduced' => 12.1,
'tags' => ['advanced'],
'profile_reference' => 'fitnesse_content',
'params' => [
],
];
}
function wikiplugin_fitnesse($data, $params)
{
$runner = Tracker_Field_Math::getRunner();
$mock = new FixtureMockTrackerField();
$runner->mockFunction('tracker-field', $mock);
$fixtures = [
'trackermath' => 'wp_fixture_tracker_math',
'trackerdata' => function ($data, $params) use ($mock) {
return wp_fixture_tracker_data($data, $params, $mock);
},
];
$matches = WikiParser_PluginMatcher::match($data);
$argParser = new WikiParser_PluginArgumentParser();
foreach ($matches as $table) {
$fixture = $table->getName();
$arguments = $table->getArguments();
$arguments = $argParser->parse($arguments);
$body = trim($table->getBody());
if (isset($fixtures[$fixture])) {
$replace = call_user_func($fixtures[$fixture], $body, new JitFilter($arguments));
$table->replaceWith($replace);
} else {
$data = new FixtureTable($body);
$table->replaceWith('__' . tr('Fixture not found: %0', $fixture) . "__\n$data");
}
}
Tracker_Field_Math::resetRunner();
return $matches->getText();
}
function wp_fixture_tracker_math($data, $params)
{
$table = new FixtureTable($data);
$trackerId = $params->trackerId->int();
$tracker = Tracker_Definition::get($trackerId);
if (! $tracker) {
return '__' . tr('Tracker not found.') . '__';
}
$smarty = TikiLib::lib('smarty');
$smarty->loadPlugin('smarty_modifier_sefurl');
$url = smarty_modifier_sefurl($trackerId, 'tracker');
$table->setTitle(tr('Tracker Math for [%0|%1]', $url, $tracker->getConfiguration('name')));
$factory = new Tracker_Field_Factory($tracker);
$checks = [];
$headings = $table->getHeadings();
foreach ($headings as $key => $heading) {
$permName = rtrim($heading, '?');
if (! $field = $tracker->getFieldFromPermName($permName)) {
return '__' . tr('Tracker Field not found: %0', $permName) . '__';
}
if ($permName != $heading) {
$checks[$key] = $factory->getHandler($field);
if (! $checks[$key] instanceof Tracker_Field_Math) {
return '__' . tr('Field is not a math field: %0', $permName) . '__';
}
}
}
foreach ($table as $row) {
$variableNames = array_map('rtrim', $headings, array_fill(0, count($headings), '?'));
$variables = array_combine($variableNames, $row);
foreach ($checks as $key => $field) {
$out = $field->handleFinalSave($variables);
if ($out == $row[$key]) {
$table->setValue($key, $out, 'green');
} else {
$table->setValue($key, tr("%0 (expect: %1)", $out, $row[$key]), 'red');
}
}
}
return $table;
}
function wp_fixture_tracker_data($data, $params, $mock)
{
$table = new FixtureTable($data);
$headings = $table->getHeadings();
$trackerId = $params->trackerId->int();
$tracker = Tracker_Definition::get($trackerId);
if (! $tracker) {
return '__' . tr('Tracker not found.') . '__';
}
$smarty = TikiLib::lib('smarty');
$smarty->loadPlugin('smarty_modifier_sefurl');
$url = smarty_modifier_sefurl($trackerId, 'tracker');
$table->setTitle(tr('Tracker Data for [%0|%1]', $url, $tracker->getConfiguration('name')));
if (! in_array('itemId', $headings)) {
return '__' . tr('Table must contain at least one field named itemId') . '__';
}
foreach ($headings as $permName) {
if ($permName != 'itemId' && ! $field = $tracker->getFieldFromPermName($permName)) {
return '__' . tr('Tracker Field not found: %0', $permName) . '__';
}
}
foreach ($table as $row) {
$fields = array_combine($headings, $row);
$itemId = $fields['itemId'];
unset($fields['itemId']);
$mock->addValues($itemId, $fields);
}
return $table;
}
class FixtureTable implements Iterator
{
private $title;
private $headings = [];
private $data = [];
private $position = 0;
function __construct($string)
{
$lines = explode("\n", $string);
$lines = array_map(function ($line) {
return array_map('trim', explode('|', $line));
}, $lines);
$this->headings = array_shift($lines);
$length = count($this->headings);
$this->data = array_map(function ($line) use ($length) {
return array_pad($line, $length, null);
}, $lines);
}
function __toString()
{
$lines = $this->data;
array_unshift($lines, array_map(function ($entry) {
return "__{$entry}__";
}, $this->headings));
if ($this->title) {
array_unshift($lines, [$this->title]);
}
return "||" . implode("\n", array_map(function ($line) {
return implode(' | ', $line);
}, $lines)) . "||";
}
function getHeadings()
{
return $this->headings;
}
function setTitle($title)
{
$this->title = $title;
}
function rewind(): void
{
$this->position = 0;
}
#[\ReturnTypeWillChange]
function current()
{
return array_map(function ($value) {
return str_replace('%%%', "\n", $value);
}, $this->data[$this->position]);
}
#[\ReturnTypeWillChange]
function key()
{
return $this->position;
}
function next(): void
{
++$this->position;
}
function valid(): bool
{
return isset($this->data[$this->position]);
}
function setValue($pos, $value, $color = null)
{
if ($color) {
$value = "~~$color:$value~~";
}
$this->data[$this->position][$pos] = str_replace("\n", '%%%', $value);
}
}
class FixtureMockTrackerField extends Tiki_Formula_Function_TrackerField
{
private $data = [];
function fetchValue($object, $field, $default)
{
if (isset($this->data[$object][$field])) {
return $this->data[$object][$field];
} else {
return $default;
}
}
function addValues($id, array $data)
{
if (! isset($this->data[$id])) {
$this->data[$id] = $data;
} else {
$this->data[$id] = array_merge($this->data[$id], $data);
}
}
}