tests/tools/test_CustomIntCtrl.py
author |
Andrey Skvortsov <andrej.skvortzov@gmail.com> |
|
Tue, 05 Mar 2019 11:19:36 +0300 |
changeset 2519 |
27955f010b23 |
parent 2437 |
105c20fdeb19
|
permissions |
-rw-r--r-- |
Fix crash if LD input contact isn't connected
Traceback (most recent call last):
File "/home/developer/WorkData/PLC/beremiz/beremiz/BeremizIDE.py", line 339, in OnMethod
obj.CTR.CallMethod('_'+meth)
File "/home/developer/WorkData/PLC/beremiz/beremiz/ProjectController.py", line 1996, in CallMethod
getattr(self, method)()
File "/home/developer/WorkData/PLC/beremiz/beremiz/ProjectController.py", line 1134, in _Build
IECGenRes = self._Generate_SoftPLC()
File "/home/developer/WorkData/PLC/beremiz/beremiz/ProjectController.py", line 746, in _Generate_SoftPLC
if self._Generate_PLC_ST():
File "/home/developer/WorkData/PLC/beremiz/beremiz/ProjectController.py", line 763, in _Generate_PLC_ST
self._getIECgeneratedcodepath())
File "/home/developer/WorkData/PLC/beremiz/beremiz/PLCControler.py", line 456, in GenerateProgram
self.ProgramChunks = GenerateCurrentProgram(self, self.Project, errors, warnings)
File "/home/developer/WorkData/PLC/beremiz/beremiz/PLCGenerator.py", line 1762, in GenerateCurrentProgram
generator.GenerateProgram()
File "/home/developer/WorkData/PLC/beremiz/beremiz/PLCGenerator.py", line 478, in GenerateProgram
self.GeneratePouProgram(pou_name)
File "/home/developer/WorkData/PLC/beremiz/beremiz/PLCGenerator.py", line 260, in GeneratePouProgram
program = pou_program.GenerateProgram(pou)
File "/home/developer/WorkData/PLC/beremiz/beremiz/PLCGenerator.py", line 1718, in GenerateProgram
self.ComputeProgram(pou)
File "/home/developer/WorkData/PLC/beremiz/beremiz/PLCGenerator.py", line 1028, in ComputeProgram
self.GenerateBlock(instance, block_infos, body, None)
File "/home/developer/WorkData/PLC/beremiz/beremiz/PLCGenerator.py", line 1144, in GenerateBlock
expression = self.ComputeExpression(body, connections, executionOrderId > 0)
File "/home/developer/WorkData/PLC/beremiz/beremiz/PLCGenerator.py", line 1373, in ComputeExpression
paths = self.GeneratePaths(connections, body, order, to_inout)
File "/home/developer/WorkData/PLC/beremiz/beremiz/PLCGenerator.py", line 1344, in GeneratePaths
elif isinstance(result[0], list):
IndexError: list index out of range
Close #70
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# This file is part of Beremiz, a Integrated Development Environment for
# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
#
# Copyright (C) 2017: Andrey Skvortsov
#
# See COPYING file for copyrights details.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
from __future__ import absolute_import
from __future__ import division
import unittest
import time
import wx
import conftest
import controls.CustomIntCtrl
class TestCustomIntCtrl(unittest.TestCase):
def setUp(self):
self.app = wx.App()
self.frame = wx.Frame(None)
def tearDown(self):
self.frame.Destroy()
wx.CallAfter(self.app.Exit)
self.app.MainLoop()
def testMaxLimit(self):
"""Test working upper bound"""
self.AddControls()
self.int_ctrl.SetValue(self.max_val + 100)
self.ProcessEvents()
self.txt_ctrl.SetFocus()
self.ProcessEvents()
self.assertEqual(self.int_ctrl.GetValue(), self.max_val)
def testMinLimit(self):
"""Test working lower bound"""
self.AddControls()
self.int_ctrl.SetValue(self.min_val - 100)
self.ProcessEvents()
self.txt_ctrl.SetFocus()
self.ProcessEvents()
self.assertEqual(self.int_ctrl.GetValue(), self.min_val)
def testCorrectValue(self):
"""Test case if no limiting is necessary"""
self.AddControls()
val = (self.max_val + self.min_val) // 2
self.int_ctrl.SetValue(val)
self.ProcessEvents()
self.txt_ctrl.SetFocus()
self.ProcessEvents()
self.assertEqual(self.int_ctrl.GetValue(), val)
def testEventBinding(self):
"""Test event sending after edit and bound checks are done"""
self.AddControls()
self.event_happend = False
def EventHandler(event):
self.event_happend = True
event.Skip()
self.int_ctrl.Bind(controls.CustomIntCtrl.EVT_CUSTOM_INT, EventHandler)
val = (self.max_val + self.min_val) // 2
self.int_ctrl.SetValue(val)
self.ProcessEvents()
self.txt_ctrl.SetFocus()
self.ProcessEvents()
self.txt_ctrl.SetFocus()
self.ProcessEvents()
self.assertEqual(self.int_ctrl.GetValue(), val)
self.assertTrue(self.event_happend)
def testLongNumbers(self):
"""Test support of long integer"""
self.AddControls()
val = 40000000000
self.int_ctrl.SetMax(val)
self.int_ctrl.SetValue(val)
self.ProcessEvents()
self.txt_ctrl.SetFocus()
self.ProcessEvents()
self.assertEqual(val, val)
def ProcessEvents(self):
for dummy in range(0, 10):
wx.Yield()
time.sleep(0.01)
def AddControls(self):
vs = wx.BoxSizer(wx.VERTICAL)
self.int_ctrl = controls.CustomIntCtrl(self.frame)
self.txt_ctrl = wx.TextCtrl(self.frame)
vs.Add(self.int_ctrl, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
vs.Add(self.txt_ctrl, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
self.frame.SetSizer(vs)
vs.Fit(self.frame)
self.frame.Show()
self.frame.Raise()
self.min_val = 50
self.max_val = 100
self.int_ctrl.SetBounds(self.min_val, self.max_val)
self.ProcessEvents()
if __name__ == '__main__':
conftest.init_environment()
unittest.main()