2015-08-16 22:29:54 +00:00
|
|
|
#include "BaseTestCase.h"
|
|
|
|
|
2016-01-16 15:21:02 +00:00
|
|
|
#include "TestToolDefinition.h"
|
2015-08-16 22:29:54 +00:00
|
|
|
#include "DiffManager.h"
|
|
|
|
#include "DefinitionNode.h"
|
2015-08-17 20:55:30 +00:00
|
|
|
#include "DefinitionWatcher.h"
|
|
|
|
#include "FloatDiff.h"
|
2015-08-16 22:29:54 +00:00
|
|
|
#include "FloatNode.h"
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
TEST(DiffManager, undoRedo) {
|
2015-08-16 22:29:54 +00:00
|
|
|
DefinitionNode root(NULL, "root");
|
|
|
|
DiffManager *diffs = root.getDiffManager();
|
|
|
|
|
2015-08-17 16:18:31 +00:00
|
|
|
FloatNode leaf(&root, "value", 2.6);
|
2015-08-16 22:29:54 +00:00
|
|
|
EXPECT_DOUBLE_EQ(2.6, leaf.getValue());
|
|
|
|
|
|
|
|
leaf.setValue(4.3);
|
|
|
|
EXPECT_DOUBLE_EQ(4.3, leaf.getValue());
|
|
|
|
|
|
|
|
leaf.setValue(-2.1);
|
|
|
|
EXPECT_DOUBLE_EQ(-2.1, leaf.getValue());
|
|
|
|
|
|
|
|
diffs->undo();
|
|
|
|
EXPECT_DOUBLE_EQ(4.3, leaf.getValue());
|
|
|
|
|
|
|
|
diffs->undo();
|
|
|
|
EXPECT_DOUBLE_EQ(2.6, leaf.getValue());
|
|
|
|
|
|
|
|
diffs->redo();
|
|
|
|
EXPECT_DOUBLE_EQ(4.3, leaf.getValue());
|
|
|
|
|
|
|
|
diffs->redo();
|
|
|
|
EXPECT_DOUBLE_EQ(-2.1, leaf.getValue());
|
|
|
|
}
|
2015-08-17 16:18:31 +00:00
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
TEST(DiffManager, undoTooMuch) {
|
2015-08-17 16:18:31 +00:00
|
|
|
DefinitionNode root(NULL, "root");
|
|
|
|
DiffManager *diffs = root.getDiffManager();
|
|
|
|
|
|
|
|
FloatNode leaf(&root, "value", 1.1);
|
|
|
|
EXPECT_DOUBLE_EQ(1.1, leaf.getValue());
|
|
|
|
|
|
|
|
leaf.setValue(2.2);
|
|
|
|
EXPECT_DOUBLE_EQ(2.2, leaf.getValue());
|
|
|
|
|
|
|
|
diffs->undo();
|
|
|
|
EXPECT_DOUBLE_EQ(1.1, leaf.getValue());
|
|
|
|
|
|
|
|
diffs->undo();
|
|
|
|
EXPECT_DOUBLE_EQ(1.1, leaf.getValue());
|
|
|
|
|
|
|
|
diffs->redo();
|
|
|
|
EXPECT_DOUBLE_EQ(2.2, leaf.getValue());
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
TEST(DiffManager, redoTooMuch) {
|
2015-08-17 16:18:31 +00:00
|
|
|
DefinitionNode root(NULL, "root");
|
|
|
|
DiffManager *diffs = root.getDiffManager();
|
|
|
|
|
|
|
|
FloatNode leaf(&root, "value", 1.1);
|
|
|
|
EXPECT_DOUBLE_EQ(1.1, leaf.getValue());
|
|
|
|
|
|
|
|
leaf.setValue(2.2);
|
|
|
|
EXPECT_DOUBLE_EQ(2.2, leaf.getValue());
|
|
|
|
|
|
|
|
diffs->undo();
|
|
|
|
EXPECT_DOUBLE_EQ(1.1, leaf.getValue());
|
|
|
|
|
|
|
|
diffs->redo();
|
|
|
|
EXPECT_DOUBLE_EQ(2.2, leaf.getValue());
|
|
|
|
|
|
|
|
diffs->redo();
|
|
|
|
EXPECT_DOUBLE_EQ(2.2, leaf.getValue());
|
|
|
|
|
|
|
|
diffs->undo();
|
|
|
|
EXPECT_DOUBLE_EQ(1.1, leaf.getValue());
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
TEST(DiffManager, undoBranch) {
|
2015-08-17 16:18:31 +00:00
|
|
|
DefinitionNode root(NULL, "root");
|
|
|
|
DiffManager *diffs = root.getDiffManager();
|
|
|
|
|
|
|
|
FloatNode leaf(&root, "value", 1.1);
|
|
|
|
EXPECT_DOUBLE_EQ(1.1, leaf.getValue());
|
|
|
|
|
|
|
|
leaf.setValue(2.2);
|
|
|
|
EXPECT_DOUBLE_EQ(2.2, leaf.getValue());
|
|
|
|
|
|
|
|
leaf.setValue(3.3);
|
|
|
|
EXPECT_DOUBLE_EQ(3.3, leaf.getValue());
|
|
|
|
|
|
|
|
diffs->undo();
|
|
|
|
EXPECT_DOUBLE_EQ(2.2, leaf.getValue());
|
|
|
|
|
|
|
|
leaf.setValue(4.4);
|
|
|
|
EXPECT_DOUBLE_EQ(4.4, leaf.getValue());
|
|
|
|
|
|
|
|
diffs->undo();
|
|
|
|
EXPECT_DOUBLE_EQ(2.2, leaf.getValue());
|
|
|
|
|
|
|
|
diffs->undo();
|
|
|
|
EXPECT_DOUBLE_EQ(1.1, leaf.getValue());
|
|
|
|
|
|
|
|
diffs->redo();
|
|
|
|
EXPECT_DOUBLE_EQ(2.2, leaf.getValue());
|
|
|
|
|
|
|
|
diffs->redo();
|
|
|
|
EXPECT_DOUBLE_EQ(4.4, leaf.getValue());
|
|
|
|
|
|
|
|
diffs->redo();
|
|
|
|
EXPECT_DOUBLE_EQ(4.4, leaf.getValue());
|
|
|
|
}
|
2015-08-17 20:55:30 +00:00
|
|
|
|
2016-01-21 22:02:22 +00:00
|
|
|
namespace {
|
2015-11-09 21:30:46 +00:00
|
|
|
class TestWatcher : public DefinitionWatcher {
|
|
|
|
public:
|
|
|
|
TestWatcher(DefinitionNode *expected_node, double expected_old_value, double expected_new_value)
|
2016-01-21 22:02:22 +00:00
|
|
|
: DefinitionWatcher("TestWatcher"), expected_node(expected_node), expected_old_value(expected_old_value),
|
2015-11-09 21:30:46 +00:00
|
|
|
expected_new_value(expected_new_value) {
|
2015-08-17 20:55:30 +00:00
|
|
|
calls = 0;
|
|
|
|
}
|
|
|
|
|
2016-01-21 22:02:22 +00:00
|
|
|
void start(bool init_diffs) {
|
|
|
|
startWatching(expected_node, init_diffs);
|
|
|
|
}
|
|
|
|
|
2016-01-16 15:21:02 +00:00
|
|
|
virtual void nodeChanged(const DefinitionNode *node, const DefinitionDiff *diff, const DefinitionNode *) override {
|
2015-08-17 20:55:30 +00:00
|
|
|
EXPECT_EQ(expected_node, node);
|
|
|
|
ASSERT_EQ("float", diff->getTypeName());
|
2016-01-21 22:02:22 +00:00
|
|
|
auto float_diff = static_cast<const FloatDiff *>(diff);
|
2015-08-17 20:55:30 +00:00
|
|
|
EXPECT_EQ(expected_old_value, float_diff->getOldValue());
|
|
|
|
EXPECT_EQ(expected_new_value, float_diff->getNewValue());
|
|
|
|
calls++;
|
|
|
|
}
|
|
|
|
|
|
|
|
int calls;
|
2015-11-09 21:30:46 +00:00
|
|
|
DefinitionNode *expected_node;
|
2015-08-17 20:55:30 +00:00
|
|
|
double expected_old_value;
|
|
|
|
double expected_new_value;
|
|
|
|
};
|
2016-01-21 22:02:22 +00:00
|
|
|
}
|
2015-08-17 20:55:30 +00:00
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
TEST(DiffManager, addWatcher) {
|
2015-08-17 20:55:30 +00:00
|
|
|
FloatNode node(NULL, "node");
|
|
|
|
TestWatcher watcher(&node, 1.3, -4.0);
|
|
|
|
|
|
|
|
node.setValue(1.3);
|
|
|
|
EXPECT_EQ(0, watcher.calls);
|
|
|
|
|
2016-01-21 22:02:22 +00:00
|
|
|
watcher.start(false);
|
2015-08-17 20:55:30 +00:00
|
|
|
EXPECT_EQ(0, watcher.calls);
|
|
|
|
|
|
|
|
node.setValue(-4.0);
|
|
|
|
EXPECT_EQ(1, watcher.calls);
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
TEST(DiffManager, addWatcherWithInitDiffs) {
|
2015-08-17 20:55:30 +00:00
|
|
|
FloatNode node(NULL, "node", 1.3);
|
|
|
|
TestWatcher watcher(&node, 1.3, 1.3);
|
|
|
|
|
2016-01-21 22:02:22 +00:00
|
|
|
watcher.start(true);
|
2015-08-17 20:55:30 +00:00
|
|
|
EXPECT_EQ(1, watcher.calls);
|
|
|
|
}
|
2016-01-16 15:21:02 +00:00
|
|
|
|
|
|
|
TEST(DiffManager, publishToWatcher) {
|
|
|
|
DefinitionNode root(NULL, "root");
|
|
|
|
FloatNode node(&root, "node", 1.3);
|
|
|
|
RecordingDefinitionWatcher watcher;
|
|
|
|
|
|
|
|
EXPECT_EQ(0u, watcher.changes.size());
|
|
|
|
|
2016-01-21 22:02:22 +00:00
|
|
|
watcher.start(&root);
|
2016-01-16 15:21:02 +00:00
|
|
|
ASSERT_EQ(1u, watcher.changes.size());
|
|
|
|
EXPECT_EQ(&root, watcher.changes[0].node);
|
|
|
|
EXPECT_EQ(&root, watcher.changes[0].parent);
|
|
|
|
|
2016-01-21 22:02:22 +00:00
|
|
|
watcher.start(&node);
|
2016-01-16 15:21:02 +00:00
|
|
|
ASSERT_EQ(2u, watcher.changes.size());
|
|
|
|
EXPECT_EQ(&node, watcher.changes[1].node);
|
|
|
|
EXPECT_EQ(&node, watcher.changes[1].parent);
|
|
|
|
|
|
|
|
node.setValue(2.3);
|
|
|
|
ASSERT_EQ(4u, watcher.changes.size());
|
|
|
|
EXPECT_EQ(&node, watcher.changes[2].node);
|
|
|
|
EXPECT_EQ(&node, watcher.changes[2].parent);
|
|
|
|
EXPECT_EQ(&node, watcher.changes[3].node);
|
|
|
|
EXPECT_EQ(&root, watcher.changes[3].parent);
|
|
|
|
}
|