Skip to content

Commit

Permalink
Add scene and socket tests
Browse files Browse the repository at this point in the history
  • Loading branch information
don4get committed Jan 17, 2020
1 parent fa064d9 commit b00696d
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 24 deletions.
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ install:

jobs:
include:
- python: 3.8
- python: 3.6
env: TOXENV=flake8
- python: 3.8
env: TOXENV=black
Expand Down
14 changes: 8 additions & 6 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@ Graphical editor for physical modeling and simulation.
https://www.nodedge.io

.. image:: https://badge.fury.io/py/nodedge.svg
:target: https://badge.fury.io/py/nodedge
:target: https://badge.fury.io/py/nodedge
:alt: PyPI - Nodedge Version

.. image:: https://img.shields.io/pypi/pyversions/nodedge
:alt: PyPI - Python Version
:target: https://badge.fury.io/py/nodedge
:alt: PyPI - Python Version

.. image:: https://img.shields.io/badge/license-GPL3.0-blue.svg?style=flat
:target: https://choosealicense.com/licenses/gpl-3.0/
Expand All @@ -23,12 +25,12 @@ https://www.nodedge.io
:alt: Test Coverage

.. image:: https://readthedocs.org/projects/nodedge/badge/?version=latest
:target: https://nodedge.readthedocs.io/en/latest/?badge=latest
:alt: Documentation Status
:target: https://nodedge.readthedocs.io/en/latest/?badge=latest
:alt: Documentation Status

.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
:target: https://github.com/psf/black
:alt: Code Style
:target: https://github.com/psf/black
:alt: Code Style


How to install
Expand Down
2 changes: 2 additions & 0 deletions nodedge/graphics_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ def __init__(self, graphicsScene, parent=None):
self.zoomRange = [0, 10]
self.zoom = 10

self.lastSceneMousePos = QPointF()

self.mode = MODE_NOOP
self.lastLMBClickScenePos = None
self.edgeStartDragThreshold = 10
Expand Down
31 changes: 16 additions & 15 deletions nodedge/socket.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import logging
from collections import OrderedDict
from typing import Collection, List, NoReturn, Optional

from nodedge.graphics_socket import GraphicsSocket
from nodedge.serializable import Serializable
Expand All @@ -24,44 +25,44 @@ def __init__(
isInput: bool = False,
):
super().__init__()
self.node = node
self.index = index
self.position = position
self.countOnThisNodeSide = countOnThisNodeSide
self.isInput = isInput
self.node: "Node" = node
self.index: int = index
self.position: int = position
self.countOnThisNodeSide: int = countOnThisNodeSide
self.isInput: bool = isInput

self.socketType = socketType
self.allowsMultiEdges = allowsMultiEdges
self.socketType: int = socketType
self.allowsMultiEdges: bool = allowsMultiEdges

self.__logger = logging.getLogger(__file__)
self.__logger.setLevel(logging.INFO)

self.graphicsSocket = GraphicsSocket(self, self.socketType)
self.graphicsSocket: GraphicsSocket = GraphicsSocket(self, self.socketType)
self.updateSocketPos()

self.edges = []
self.edges: List["Edge"] = []

def __repr__(self):
return f"0x{hex(id(self))[-4:]} Socket({self.index}, {self.position}, {self.socketType}, {self.allowsMultiEdges})"

def updateSocketPos(self):
def updateSocketPos(self) -> NoReturn:
self.graphicsSocket.setPos(
*self.node.socketPos(self.index, self.position, self.countOnThisNodeSide)
)

def socketPos(self):
def socketPos(self) -> Collection[float]:
ret = self.node.socketPos(self.index, self.position, self.countOnThisNodeSide)
self.__logger.debug(
f"getSocketPos: {self.index}, {self.position}, {self.node}, {ret}"
)

return ret

def addEdge(self, edge=None):
def addEdge(self, edge: Optional["Edge"] = None) -> NoReturn:
if edge not in self.edges:
self.edges.append(edge)

def removeEdge(self, edgeToRemove):
def removeEdge(self, edgeToRemove: "Edge") -> NoReturn:
if edgeToRemove in self.edges:
self.edges.remove(edgeToRemove)
else:
Expand All @@ -74,9 +75,9 @@ def determineAllowsMultiEdges(self, data):
# Probably older version of file, make right socket multiedged by default
return data["position"] in (RIGHT_BOTTOM, RIGHT_TOP)

def removeAllEdges(self):
def removeAllEdges(self) -> NoReturn:
while self.edges:
edge = self.edges.pop(0)
edge: "Edge" = self.edges.pop(0)
self.__logger.debug(f"Removing {edge} from {self}")
edge.remove()

Expand Down
36 changes: 34 additions & 2 deletions tests/scene_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from nodedge.edge import Edge
from nodedge.editor_widget import EditorWidget
from nodedge.node import Node
from nodedge.scene import Scene


@pytest.fixture
Expand All @@ -17,8 +18,8 @@ def emptyScene(qtbot):

@pytest.fixture
def filledScene(emptyScene):
node = Node(emptyScene) # noqa: F841
edge = Edge(emptyScene) # noqa: F841
node = Node(emptyScene, "", [1], [1]) # noqa: F841
edge = Edge(emptyScene, node.inputSockets[0], node.outputSockets[0]) # noqa: F841

return emptyScene

Expand Down Expand Up @@ -112,3 +113,34 @@ def test_resetLastSelectedStates(filledScene):

assert filledScene.nodes[0].graphicsNode.selectedState is False
assert filledScene.edges[0].graphicsEdge.selectedState is False


def test_serializeSelected(qtbot):
window = QMainWindow()
editor = EditorWidget(window)
qtbot.addWidget(editor)
scene = editor.scene
node = Node(scene, "", [1], [1]) # noqa: F841
edge = Edge(scene, node.inputSockets[0], node.outputSockets[0]) # noqa: F841

graphicsEdge = edge.graphicsEdge
graphicsEdge.setSelected(True)
graphicsNode = node.graphicsNode
graphicsNode.setSelected(True)
assert set(scene.graphicsScene.selectedItems()) <= {graphicsEdge, graphicsNode}

expectedTitle = "A great title"
node.title = expectedTitle
data = scene.clipboard.serializeSelected()

scene.clear()
assert scene.nodes == []
assert scene.edges == []

scene.clipboard.deserialize(data)

deserializedNode: Node = scene.nodes[0]
assert deserializedNode.title == expectedTitle
deserializedEdge: Edge = scene.edges[0]
assert deserializedEdge.startSocket == deserializedNode.inputSockets[0]
assert deserializedEdge.endSocket == deserializedNode.outputSockets[0]
24 changes: 24 additions & 0 deletions tests/socket_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import pytest
from PyQt5.QtCore import QPointF
from PyQt5.QtWidgets import QMainWindow

from nodedge.edge import Edge
from nodedge.editor_widget import EditorWidget
from nodedge.node import Node
from nodedge.scene import Scene


@pytest.fixture
def emptyScene(qtbot):
window = QMainWindow()
editor = EditorWidget(window)
qtbot.addWidget(editor)

return editor.scene


@pytest.fixture
def undefinedNode(emptyScene: Scene) -> Node:
node = Node(emptyScene) # noqa: F841

return emptyScene.nodes[0]

0 comments on commit b00696d

Please sign in to comment.