diff --git a/src/definition/IntDiff.cpp b/src/definition/IntDiff.cpp new file mode 100644 index 0000000..792acf8 --- /dev/null +++ b/src/definition/IntDiff.cpp @@ -0,0 +1,7 @@ +#include "IntDiff.h" + +IntDiff::IntDiff(const DefinitionNode *node, int oldvalue, int newvalue): + DefinitionDiff(node), oldvalue(oldvalue), newvalue(newvalue) +{ +} + diff --git a/src/definition/IntDiff.h b/src/definition/IntDiff.h new file mode 100644 index 0000000..c337124 --- /dev/null +++ b/src/definition/IntDiff.h @@ -0,0 +1,30 @@ +#ifndef INTDIFF_H +#define INTDIFF_H + +#include "definition_global.h" + +#include "DefinitionDiff.h" + +namespace paysages { +namespace definition { + +/** + * Diff for an IntNode. + */ +class DEFINITIONSHARED_EXPORT IntDiff: public DefinitionDiff +{ +public: + IntDiff(const DefinitionNode *node, int oldvalue, int newvalue); + + inline int getOldValue() const {return oldvalue;} + inline int getNewValue() const {return newvalue;} + +private: + int oldvalue; + int newvalue; +}; + +} +} + +#endif // INTDIFF_H diff --git a/src/definition/IntNode.cpp b/src/definition/IntNode.cpp new file mode 100644 index 0000000..cd16c49 --- /dev/null +++ b/src/definition/IntNode.cpp @@ -0,0 +1,83 @@ +#include "IntNode.h" + +#include "PackStream.h" +#include "IntDiff.h" +#include "Logs.h" +#include +#include + +IntNode::IntNode(DefinitionNode* parent, const std::string &name, int value): + DefinitionNode(parent, name, "int"), value(value) +{ +} + +std::string IntNode::toString(int indent) const +{ + std::ostringstream stream; + + stream << DefinitionNode::toString(indent) << " " << value; + + return stream.str(); +} + +void IntNode::save(PackStream *stream) const +{ + stream->write(&value); +} + +void IntNode::load(PackStream *stream) +{ + stream->read(&value); +} + +void IntNode::copy(DefinitionNode *destination) const +{ + if (destination->getTypeName() == getTypeName()) + { + ((IntNode *)destination)->value = value; + } + else + { + Logs::error() << "Can't copy from " << getTypeName() << " to " << destination->getTypeName() << std::endl; + } +} + +void IntNode::setValue(int new_value) +{ + addDiff(produceDiff(new_value)); +} + +const IntDiff *IntNode::produceDiff(int new_value) const +{ + return new IntDiff(this, value, new_value); +} + +void IntNode::generateInitDiffs(std::vector *diffs) const +{ + diffs->push_back(produceDiff(value)); +} + +bool IntNode::applyDiff(const DefinitionDiff *diff, bool backward) +{ + if (!DefinitionNode::applyDiff(diff, backward)) + { + return false; + } + + assert(diff->getTypeName() == "int"); + const IntDiff *int_diff = (const IntDiff *)diff; + + double previous = backward ? int_diff->getNewValue() : int_diff->getOldValue(); + double next = backward ? int_diff->getOldValue() : int_diff->getNewValue(); + + if (value == previous) + { + value = next; + return true; + } + else + { + Logs::error() << "Can't apply int diff " << previous << " => " << next << " to " << getName() << std::endl; + return false; + } +} diff --git a/src/definition/IntNode.h b/src/definition/IntNode.h new file mode 100644 index 0000000..bf9ccf6 --- /dev/null +++ b/src/definition/IntNode.h @@ -0,0 +1,43 @@ +#ifndef INTNODE_H +#define INTNODE_H + +#include "definition_global.h" + +#include "DefinitionNode.h" + +namespace paysages { +namespace definition { + +/** + * Node with a single integer value, for the definition tree. + */ +class DEFINITIONSHARED_EXPORT IntNode: public DefinitionNode +{ +public: + IntNode(DefinitionNode* parent, const std::string &name, int value = 0); + + inline int getValue() const {return value;} + + virtual std::string toString(int indent) const override; + virtual void save(PackStream* stream) const override; + virtual void load(PackStream* stream) override; + virtual void copy(DefinitionNode* destination) const override; + + /** + * Change the int value stored. + * + * The DiffManager is used as intermediary, so that the change may not happen immediately. + */ + void setValue(int new_value); + const IntDiff *produceDiff(int new_value) const; + void generateInitDiffs(std::vector *diffs) const; + virtual bool applyDiff(const DefinitionDiff *diff, bool backward=false) override; + +private: + int value; +}; + +} +} + +#endif // INTNODE_H diff --git a/src/definition/WaterDefinition.cpp b/src/definition/WaterDefinition.cpp index e6bd72a..d739af7 100644 --- a/src/definition/WaterDefinition.cpp +++ b/src/definition/WaterDefinition.cpp @@ -4,11 +4,13 @@ #include "NoiseState.h" #include "Color.h" #include "SurfaceMaterial.h" +#include "IntNode.h" #include "FloatNode.h" WaterDefinition::WaterDefinition(DefinitionNode* parent): DefinitionNode(parent, "water", "water") { + model = new IntNode(this, "model", -1); reflection = new FloatNode(this, "reflection"); material = new SurfaceMaterial; @@ -24,6 +26,8 @@ WaterDefinition::WaterDefinition(DefinitionNode* parent): detail_height = 0.0; turbulence = 0.0; foam_coverage = 0.0; + + model->addWatcher(this, true); } WaterDefinition::~WaterDefinition() @@ -101,47 +105,6 @@ void WaterDefinition::validate() { DefinitionNode::validate(); - material->validate(); - foam_material->validate(); -} - -void WaterDefinition::applyPreset(WaterPreset preset) -{ - noise_state->randomizeOffsets(); - - if (preset == WATER_PRESET_LAKE) - { - transparency = 0.5; - reflection->setValue(0.2); - transparency_depth = 4.0; - material->setColor(0.08, 0.15, 0.2, 1.0); - depth_color->r = 0.0; - depth_color->g = 0.1; - depth_color->b = 0.1; - lighting_depth = 6.0; - scaling = 1.0; - waves_height = 0.8; - detail_height = 0.05; - turbulence = 0.1; - foam_coverage = 0.15; - } - else if (preset == WATER_PRESET_SEA) - { - transparency = 0.3; - reflection->setValue(0.07); - transparency_depth = 3.0; - material->setColor(0.05, 0.18, 0.2, 1.0); - depth_color->r = 0.0; - depth_color->g = 0.18; - depth_color->b = 0.15; - lighting_depth = 4.0; - scaling = 1.5; - waves_height = 1.0; - detail_height = 0.06; - turbulence = 0.3; - foam_coverage = 0.4; - } - depth_color->a = 1.0; material->base->a = 1.0; material->reflection = 1.0; @@ -152,5 +115,61 @@ void WaterDefinition::applyPreset(WaterPreset preset) foam_material->shininess = 1.5; foam_material->hardness = 0.2; - validate(); + material->validate(); + foam_material->validate(); +} + +void WaterDefinition::nodeChanged(const DefinitionNode *node, const DefinitionDiff *) +{ + if (node == model) + { + noise_state->randomizeOffsets(); + + switch (model->getValue()) + { + case 1: + transparency = 0.3; + reflection->setValue(0.07); + transparency_depth = 3.0; + material->setColor(0.05, 0.18, 0.2, 1.0); + depth_color->r = 0.0; + depth_color->g = 0.18; + depth_color->b = 0.15; + lighting_depth = 4.0; + scaling = 1.5; + waves_height = 1.0; + detail_height = 0.06; + turbulence = 0.3; + foam_coverage = 0.4; + break; + case 0: + default: + transparency = 0.5; + reflection->setValue(0.2); + transparency_depth = 4.0; + material->setColor(0.08, 0.15, 0.2, 1.0); + depth_color->r = 0.0; + depth_color->g = 0.1; + depth_color->b = 0.1; + lighting_depth = 6.0; + scaling = 1.0; + waves_height = 0.8; + detail_height = 0.05; + turbulence = 0.1; + foam_coverage = 0.15; + break; + } + } +} + +void WaterDefinition::applyPreset(WaterPreset preset) +{ + if (preset == WATER_PRESET_LAKE) + { + model->setValue(0); + } + else if (preset == WATER_PRESET_SEA) + { + model->setValue(1); + } } diff --git a/src/definition/WaterDefinition.h b/src/definition/WaterDefinition.h index c55f999..69eddfa 100644 --- a/src/definition/WaterDefinition.h +++ b/src/definition/WaterDefinition.h @@ -4,11 +4,12 @@ #include "definition_global.h" #include "DefinitionNode.h" +#include "DefinitionWatcher.h" namespace paysages { namespace definition { -class DEFINITIONSHARED_EXPORT WaterDefinition: public DefinitionNode +class DEFINITIONSHARED_EXPORT WaterDefinition: public DefinitionNode, public DefinitionWatcher { public: WaterDefinition(DefinitionNode* parent); @@ -20,9 +21,11 @@ public: virtual void copy(DefinitionNode* destination) const override; virtual void validate() override; + inline IntNode *propModel() const {return model;} inline FloatNode *propReflection() const {return reflection;} -public: + virtual void nodeChanged(const DefinitionNode *node, const DefinitionDiff *diff); + typedef enum { WATER_PRESET_LAKE, @@ -48,6 +51,7 @@ public: NoiseState* noise_state; private: + IntNode *model; FloatNode *reflection; }; diff --git a/src/definition/definition.pro b/src/definition/definition.pro index 8714bfa..7105ccf 100644 --- a/src/definition/definition.pro +++ b/src/definition/definition.pro @@ -35,7 +35,9 @@ SOURCES += \ DefinitionDiff.cpp \ FloatDiff.cpp \ DiffManager.cpp \ - DefinitionWatcher.cpp + DefinitionWatcher.cpp \ + IntNode.cpp \ + IntDiff.cpp HEADERS +=\ definition_global.h \ @@ -60,7 +62,9 @@ HEADERS +=\ DefinitionDiff.h \ FloatDiff.h \ DiffManager.h \ - DefinitionWatcher.h + DefinitionWatcher.h \ + IntNode.h \ + IntDiff.h unix:!symbian { maemo5 { diff --git a/src/definition/definition_global.h b/src/definition/definition_global.h index 1909942..9f2d446 100644 --- a/src/definition/definition_global.h +++ b/src/definition/definition_global.h @@ -17,6 +17,8 @@ namespace definition { class DefinitionDiff; class FloatNode; class FloatDiff; + class IntNode; + class IntDiff; class DiffManager; class DefinitionWatcher; class Scenery; diff --git a/src/interface/modeler/quickapp/FloatPropertyBind.cpp b/src/interface/modeler/quickapp/FloatPropertyBind.cpp index bc7d572..7c40386 100644 --- a/src/interface/modeler/quickapp/FloatPropertyBind.cpp +++ b/src/interface/modeler/quickapp/FloatPropertyBind.cpp @@ -4,7 +4,6 @@ #include "FloatNode.h" #include "Logs.h" -#include #include FloatPropertyBind::FloatPropertyBind(MainModelerWindow *window, const QString &object_name, const QString &property_name, FloatNode *node): diff --git a/src/interface/modeler/quickapp/IntPropertyBind.cpp b/src/interface/modeler/quickapp/IntPropertyBind.cpp new file mode 100644 index 0000000..61a11e7 --- /dev/null +++ b/src/interface/modeler/quickapp/IntPropertyBind.cpp @@ -0,0 +1,37 @@ +#include "IntPropertyBind.h" + +#include "MainModelerWindow.h" +#include "IntNode.h" +#include "Logs.h" + +IntPropertyBind::IntPropertyBind(MainModelerWindow *window, const QString &object_name, const QString &property_name, IntNode *node): + QObject(window), node(node), property(property_name) +{ + item = window->findQmlObject(object_name); + if (item) + { + node->addWatcher(this, true); + connect(item, SIGNAL(changed(int)), this, SLOT(propertyChanged(int))); + } + else + { + item = NULL; + Logs::error() << "Can't find object :" << object_name.toStdString() << std::endl; + } +} + +void IntPropertyBind::nodeChanged(const DefinitionNode *, const DefinitionDiff *) +{ + if (item) + { + item->setProperty(property.toLocal8Bit(), node->getValue()); + } +} + +void IntPropertyBind::propertyChanged(int value) +{ + if (value != node->getValue()) + { + node->setValue(value); + } +} diff --git a/src/interface/modeler/quickapp/IntPropertyBind.h b/src/interface/modeler/quickapp/IntPropertyBind.h new file mode 100644 index 0000000..f8bbfdf --- /dev/null +++ b/src/interface/modeler/quickapp/IntPropertyBind.h @@ -0,0 +1,36 @@ +#ifndef INTPROPERTYBIND_H +#define INTPROPERTYBIND_H + +#include "modeler_global.h" + +#include +#include "DefinitionWatcher.h" + +namespace paysages { +namespace modeler { + +/** + * Bind an int Qml property to an IntNode. + * + * The IntNode must exist through this object lifetime. + */ +class IntPropertyBind : public QObject, public DefinitionWatcher +{ + Q_OBJECT +public: + IntPropertyBind(MainModelerWindow *window, const QString &object_name, const QString &property_name, IntNode *node); + + virtual void nodeChanged(const DefinitionNode *node, const DefinitionDiff *diff) override; + +private slots: + void propertyChanged(int value); + +private: + IntNode *node; + QString property; + QObject *item; +}; + +} +} +#endif // INTPROPERTYBIND_H diff --git a/src/interface/modeler/quickapp/WaterModeler.cpp b/src/interface/modeler/quickapp/WaterModeler.cpp index 4f4fe73..d44af33 100644 --- a/src/interface/modeler/quickapp/WaterModeler.cpp +++ b/src/interface/modeler/quickapp/WaterModeler.cpp @@ -5,6 +5,7 @@ #include "TerrainDefinition.h" #include "WaterDefinition.h" #include "FloatPropertyBind.h" +#include "IntPropertyBind.h" #include "OpenGLRenderer.h" #include "OpenGLWater.h" @@ -17,14 +18,16 @@ WaterModeler::WaterModeler(MainModelerWindow *ui): connect(toggle_water, SIGNAL(toggled(bool)), this, SLOT(enableRendering(bool))); } - prop_water_height = new FloatPropertyBind(ui, "water_height", "value", ui->getScenery()->getTerrain()->propWaterHeight()); - prop_water_reflexion = new FloatPropertyBind(ui, "water_reflection", "value", ui->getScenery()->getWater()->propReflection()); + prop_model = new IntPropertyBind(ui, "water_model", "value", ui->getScenery()->getWater()->propModel()); + prop_height = new FloatPropertyBind(ui, "water_height", "value", ui->getScenery()->getTerrain()->propWaterHeight()); + prop_reflexion = new FloatPropertyBind(ui, "water_reflection", "value", ui->getScenery()->getWater()->propReflection()); } WaterModeler::~WaterModeler() { - delete prop_water_height; - delete prop_water_reflexion; + delete prop_model; + delete prop_height; + delete prop_reflexion; } void WaterModeler::enableRendering(bool enable) diff --git a/src/interface/modeler/quickapp/WaterModeler.h b/src/interface/modeler/quickapp/WaterModeler.h index a50a9a1..1ecd487 100644 --- a/src/interface/modeler/quickapp/WaterModeler.h +++ b/src/interface/modeler/quickapp/WaterModeler.h @@ -20,8 +20,9 @@ public slots: private: MainModelerWindow *ui; - FloatPropertyBind *prop_water_height; - FloatPropertyBind *prop_water_reflexion; + IntPropertyBind *prop_model; + FloatPropertyBind *prop_height; + FloatPropertyBind *prop_reflexion; }; } diff --git a/src/interface/modeler/quickapp/modeler_global.h b/src/interface/modeler/quickapp/modeler_global.h index 717e7c5..77b8895 100644 --- a/src/interface/modeler/quickapp/modeler_global.h +++ b/src/interface/modeler/quickapp/modeler_global.h @@ -19,6 +19,7 @@ namespace modeler { class ModelerCameras; class FloatPropertyBind; + class IntPropertyBind; } } diff --git a/src/interface/modeler/quickapp/qml/PanelPictureChoice.qml b/src/interface/modeler/quickapp/qml/PanelPictureChoice.qml new file mode 100644 index 0000000..d347a0a --- /dev/null +++ b/src/interface/modeler/quickapp/qml/PanelPictureChoice.qml @@ -0,0 +1,48 @@ +import QtQuick 2.0 +import QtQuick.Controls 1.2 + +// Panel with a selection of pictures to choose from +// Mainly used for presets or models +BasePanel { + id: panel + property alias items: container.children + property int value: -1 + width: items[0].width + 10 + signal changed(int value) + + ExclusiveGroup { + id: exclusive_item + + onCurrentChanged: { + if (current) { + panel.value = current.position; + } else { + panel.value = -1; + } + } + } + + onValueChanged: { + if (!exclusive_item.current || exclusive_item.current.position !== panel.value) { + if (panel.value >= 0) { + exclusive_item.current = items[panel.value]; + } else { + exclusive_item.current = null; + } + } + changed(value); + } + + onItemsChanged: { + for (var i = 0; i < items.length; i++) { + items[i].exclusiveGroup = exclusive_item; + items[i].position = i; + } + } + + Column { + id: container + anchors.centerIn: panel + } +} + diff --git a/src/interface/modeler/quickapp/qml/PictureChoiceItem.qml b/src/interface/modeler/quickapp/qml/PictureChoiceItem.qml new file mode 100644 index 0000000..f295498 --- /dev/null +++ b/src/interface/modeler/quickapp/qml/PictureChoiceItem.qml @@ -0,0 +1,7 @@ +import QtQuick 2.0 + +ToolbarButton { + property int position: -1 + image_width: 128 + image_height: 128 +} diff --git a/src/interface/modeler/quickapp/qml/ToolbarButton.qml b/src/interface/modeler/quickapp/qml/ToolbarButton.qml index def0465..48fdba6 100644 --- a/src/interface/modeler/quickapp/qml/ToolbarButton.qml +++ b/src/interface/modeler/quickapp/qml/ToolbarButton.qml @@ -13,6 +13,8 @@ Item { property string helptext property string hovertext property string shortcut + property alias image_width: image.width + property alias image_height: image.height signal clicked signal toggled(bool value) diff --git a/src/interface/modeler/quickapp/qml/WaterSection.qml b/src/interface/modeler/quickapp/qml/WaterSection.qml index d77d6ce..2989504 100644 --- a/src/interface/modeler/quickapp/qml/WaterSection.qml +++ b/src/interface/modeler/quickapp/qml/WaterSection.qml @@ -7,6 +7,12 @@ BaseSection { BaseToolbar { id: toolbar + ToolbarButton { + id: tool_water_preset + picture: "images/icon_preset.png" + hovertext: qsTr("Choose a water model") + } + ToolbarButton { id: tool_water_level checked: true @@ -16,12 +22,28 @@ BaseSection { ToolbarButton { id: tool_water_reflection - checked: false picture: "images/icon_water_reflection.png" hovertext: qsTr("Reflection of the water surface") } } + PanelPictureChoice { + id: panel_water_preset + enabled: false + anchors.left: toolbar.right + objectName: "water_model" + items: [ + PictureChoiceItem { + picture: "images/preset_water_lake.jpg" + hovertext: "Water model : Lake" + }, + PictureChoiceItem { + picture: "images/preset_water_sea.jpg" + hovertext: "Water model : Sea" + } + ] + } + PanelSimpleFloat { id: panel_water_level enabled: false @@ -39,6 +61,14 @@ BaseSection { } states: [ + State { + name: "WaterPreset" + when: tool_water_preset.checked + PropertyChanges { + target: panel_water_preset + enabled: true + } + }, State { name: "WaterHeight" when: tool_water_level.checked diff --git a/src/interface/modeler/quickapp/qml/app.qrc b/src/interface/modeler/quickapp/qml/app.qrc index 73d2d65..4f4a4b5 100644 --- a/src/interface/modeler/quickapp/qml/app.qrc +++ b/src/interface/modeler/quickapp/qml/app.qrc @@ -44,5 +44,10 @@ AtmosphereSection.qml PanelSimpleFloat.qml images/icon_water_reflection.png + PanelPictureChoice.qml + PictureChoiceItem.qml + images/preset_water_lake.jpg + images/preset_water_sea.jpg + images/icon_preset.png diff --git a/src/interface/modeler/quickapp/qml/images/icon_preset.png b/src/interface/modeler/quickapp/qml/images/icon_preset.png new file mode 100644 index 0000000..34bd0bb Binary files /dev/null and b/src/interface/modeler/quickapp/qml/images/icon_preset.png differ diff --git a/src/interface/modeler/quickapp/qml/images/preset_water_lake.jpg b/src/interface/modeler/quickapp/qml/images/preset_water_lake.jpg new file mode 100644 index 0000000..e15953b Binary files /dev/null and b/src/interface/modeler/quickapp/qml/images/preset_water_lake.jpg differ diff --git a/src/interface/modeler/quickapp/qml/images/preset_water_sea.jpg b/src/interface/modeler/quickapp/qml/images/preset_water_sea.jpg new file mode 100644 index 0000000..385d0ce Binary files /dev/null and b/src/interface/modeler/quickapp/qml/images/preset_water_sea.jpg differ diff --git a/src/interface/modeler/quickapp/quickapp.pro b/src/interface/modeler/quickapp/quickapp.pro index 1af94de..b2085b8 100644 --- a/src/interface/modeler/quickapp/quickapp.pro +++ b/src/interface/modeler/quickapp/quickapp.pro @@ -12,7 +12,8 @@ SOURCES += main.cpp \ RenderPreviewProvider.cpp \ RenderProcess.cpp \ ModelerCameras.cpp \ - FloatPropertyBind.cpp + FloatPropertyBind.cpp \ + IntPropertyBind.cpp RESOURCES += \ qml/app.qrc @@ -34,7 +35,8 @@ HEADERS += \ RenderPreviewProvider.h \ RenderProcess.h \ ModelerCameras.h \ - FloatPropertyBind.h + FloatPropertyBind.h \ + IntPropertyBind.h win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../../../system/release/ -lpaysages_system else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../../../system/debug/ -lpaysages_system diff --git a/src/tests/IntNode_Test.cpp b/src/tests/IntNode_Test.cpp new file mode 100644 index 0000000..b6cae16 --- /dev/null +++ b/src/tests/IntNode_Test.cpp @@ -0,0 +1,113 @@ +#include "BaseTestCase.h" + +#include "IntNode.h" +#include "IntDiff.h" +#include "PackStream.h" + +TEST(IntNode, toString) +{ + IntNode test(NULL, "test", 2); + + EXPECT_EQ("test 2", test.toString(0)); + EXPECT_EQ(" test 2", test.toString(2)); +} + +TEST(IntNode, saveLoadAndSkip) +{ + DefinitionNode root1(NULL, "root"); + IntNode testa1(&root1, "testa", 1); + IntNode testb1(&root1, "testb", 4); + + PackStream stream1; + root1.save(&stream1); + + DefinitionNode root2(NULL, "root"); + IntNode testb2(&root2, "testb"); + + PackStream stream2(&stream1); + root2.load(&stream2); + + EXPECT_DOUBLE_EQ(4, testb2.getValue()); +} + +TEST(IntNode, copy) +{ + IntNode base(NULL, "test", 2); + IntNode other(NULL, "test", 4); + DefinitionNode badother(NULL, "test"); + + base.copy(&other); + EXPECT_DOUBLE_EQ(2, base.getValue()); + EXPECT_DOUBLE_EQ(2, other.getValue()); + + badother.copy(&base); + EXPECT_DOUBLE_EQ(2, base.getValue()); + + base.copy(&badother); + // can't check anything, just useful in valgrind +} + +TEST(IntNode, produceDiff) +{ + IntNode node(NULL, "test", 8); + const IntDiff *diff = node.produceDiff(-4); + + EXPECT_EQ("int", diff->getTypeName()); + EXPECT_DOUBLE_EQ(8, diff->getOldValue()); + EXPECT_DOUBLE_EQ(-4, diff->getNewValue()); + + bool result = node.applyDiff(diff); + + EXPECT_TRUE(result); + EXPECT_DOUBLE_EQ(-4, node.getValue()); + + delete diff; +} + +TEST(IntNode, applyDiff) +{ + IntNode node(NULL, "test", 1); + IntDiff diff(&node, 1, 2); + DefinitionNode onode(NULL, "test", "badtype"); + DefinitionDiff odiff(&onode); + bool result; + + EXPECT_DOUBLE_EQ(1, node.getValue()); + + // apply + result = node.applyDiff(&diff); + + EXPECT_TRUE(result); + EXPECT_DOUBLE_EQ(2, node.getValue()); + + // can't apply twice + result = node.applyDiff(&diff); + + EXPECT_FALSE(result); + EXPECT_DOUBLE_EQ(2, node.getValue()); + + // reverse + result = node.applyDiff(&diff, true); + + EXPECT_TRUE(result); + EXPECT_DOUBLE_EQ(1, node.getValue()); + + // can't reverse twice + result = node.applyDiff(&diff, true); + + EXPECT_FALSE(result); + EXPECT_DOUBLE_EQ(1, node.getValue()); + + // bad type + result = node.applyDiff(&odiff); + + EXPECT_FALSE(result); + EXPECT_DOUBLE_EQ(1, node.getValue()); + + // apply again + result = node.applyDiff(&diff); + + EXPECT_TRUE(result); + EXPECT_DOUBLE_EQ(2, node.getValue()); +} + diff --git a/src/tests/tests.pro b/src/tests/tests.pro index ce4b6a1..0431165 100644 --- a/src/tests/tests.pro +++ b/src/tests/tests.pro @@ -27,7 +27,8 @@ SOURCES += main.cpp \ FloatNode_Test.cpp \ DiffManager_Test.cpp \ ColorHSL_Test.cpp \ - RenderProgress_Test.cpp + RenderProgress_Test.cpp \ + IntNode_Test.cpp HEADERS += \ BaseTestCase.h