Commit 7af994a0 authored by Kazuhiko Shiozaki's avatar Kazuhiko Shiozaki

create a simple test class that will check new simulation API.


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@31396 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent 4fdfcd05
...@@ -32,6 +32,8 @@ This test is experimental for new simulation implementation. ...@@ -32,6 +32,8 @@ This test is experimental for new simulation implementation.
import unittest import unittest
import transaction import transaction
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from Products.ERP5Type.tests.Sequence import SequenceList
from testPackingList import TestPackingList, TestPackingListMixin from testPackingList import TestPackingList, TestPackingListMixin
class TestERP5SimulationMixin(TestPackingListMixin): class TestERP5SimulationMixin(TestPackingListMixin):
...@@ -49,6 +51,160 @@ class TestERP5SimulationMixin(TestPackingListMixin): ...@@ -49,6 +51,160 @@ class TestERP5SimulationMixin(TestPackingListMixin):
if rule.getValidationState() == 'validated': if rule.getValidationState() == 'validated':
rule.invalidate() rule.invalidate()
class TestERP5Simulation(TestERP5SimulationMixin, ERP5TypeTestCase):
run_all_test = 1
quiet = 0
def validateNewRules(self):
# create a New Order Rule document.
portal_rules = self.portal.portal_rules
try:
new_order_rule = filter(
lambda x:x.title == 'New Default Order Rule',
portal_rules.objectValues(portal_type='New Order Rule'))[0]
except IndexError:
new_order_rule = portal_rules.newContent(
title='New Default Order Rule',
portal_type='New Order Rule',
reference='default_order_rule',
version=2,
)
# create category divergence testers that is only used for matching
for i in ('order',):
new_order_rule.newContent(
title='%s divergence tester' % i,
portal_type='Category Membership Divergence Tester',
tested_property=i,
divergence_provider=0,
matching_provider=1)
# create float divergence testers
for i in ('converted_quantity',):
new_order_rule.newContent(
title='%s divergence tester' % i,
portal_type='Float Divergence Tester',
tested_property=i,
use_delivery_ratio=1,
quantity_range_min=-1,
quantity_range_max=2)
if new_order_rule.getValidationState() != 'validated':
new_order_rule.validate()
def _modifyPackingListLineQuantity(self, sequence=None,
sequence_list=None, delta=0.0):
"""
Set a increased quantity on packing list lines
"""
packing_list = sequence.get('packing_list')
quantity = self.default_quantity + delta
sequence.edit(line_quantity=quantity)
for packing_list_line in packing_list.objectValues(
portal_type=self.packing_list_line_portal_type):
packing_list_line.edit(quantity=quantity)
sequence.edit(last_delta=delta)
def stepIncreasePackingListLineQuantity2(self, sequence=None,
sequence_list=None, **kw):
return self._modifyPackingListLineQuantity(sequence, sequence_list, 2.0)
def stepDecreasePackingListLineQuantity1(self, sequence=None,
sequence_list=None, **kw):
return self._modifyPackingListLineQuantity(sequence, sequence_list, -1.0)
def stepDecreasePackingListLineQuantity10(self, sequence=None,
sequence_list=None, **kw):
return self._modifyPackingListLineQuantity(sequence, sequence_list, -10.0)
def stepSplitAndDeferPackingList(self, sequence=None, sequence_list=None, **kw):
"""
Do the split and defer action
"""
packing_list = sequence.get('packing_list')
solver_tool = self.portal.portal_solvers
solver_process = solver_tool.newSolverProcess(packing_list)
quantity_solver_decision = filter(
lambda x:x.getCausalityValue().getTestedProperty()=='converted_quantity',
solver_process.contentValues())[0]
# use Quantity Split Solver.
quantity_solver_decision.setSolverValue(self.portal.portal_types['Quantity Split Solver'])
# configure for Quantity Split Solver.
kw = {'delivery_solver':'FIFO',
'start_date':packing_list.getStartDate() + 10}
quantity_solver_decision.updateConfiguration(**kw)
solver_process.buildTargetSolverList()
solver_process.solve()
# build split deliveries manually. XXX ad-hoc
previous_tag = None
for delivery_builder in packing_list.getBuilderList():
this_builder_tag = '%s_split_%s' % (packing_list.getPath(),
delivery_builder.getId())
after_tag = []
if previous_tag:
after_tag.append(previous_tag)
delivery_builder.activate(
after_method_id=('solve',
'immediateReindexObject',
'recursiveImmediateReindexObject',), # XXX too brutal.
after_tag=after_tag,
).build(explanation_uid=packing_list.getCausalityValue().getUid())
def stepCheckPackingListSplitted(self, sequence=None, sequence_list=None, **kw):
"""
Test if packing list was splitted
"""
order = sequence.get('order')
packing_list_list = order.getCausalityRelatedValueList(
portal_type=self.packing_list_portal_type)
self.assertEquals(2,len(packing_list_list))
packing_list1 = None
packing_list2 = None
for packing_list in packing_list_list:
if packing_list.getUid() == sequence.get('packing_list').getUid():
packing_list1 = packing_list
else:
packing_list2 = packing_list
sequence.edit(new_packing_list=packing_list2)
for line in packing_list1.objectValues(
portal_type= self.packing_list_line_portal_type):
self.assertEquals(self.default_quantity-10,line.getQuantity())
for line in packing_list2.objectValues(
portal_type= self.packing_list_line_portal_type):
self.assertEquals(10,line.getQuantity())
def test_01_splitAndDefer(self, quiet=quiet, run=run_all_test):
"""
Change the quantity on an delivery line, then
see if the packing list is divergent and then
split and defer the packing list
"""
if not run: return
sequence_list = SequenceList()
# Test with a simply order without cell
sequence_string = self.default_sequence + '\
stepIncreasePackingListLineQuantity2 \
stepCheckPackingListIsCalculating \
stepTic \
stepCheckPackingListIsNotDivergent \
stepCheckPackingListIsSolved \
stepDecreasePackingListLineQuantity1 \
stepCheckPackingListIsCalculating \
stepTic \
stepCheckPackingListIsNotDivergent \
stepCheckPackingListIsSolved \
stepDecreasePackingListLineQuantity10 \
stepCheckPackingListIsCalculating \
stepTic \
stepCheckPackingListIsDiverged \
stepSplitAndDeferPackingList \
stepTic \
stepCheckPackingListSplitted \
stepCheckPackingListIsSolved \
'
sequence_list.addSequenceString(sequence_string)
sequence_list.play(self, quiet=quiet)
class TestERP5SimulationPackingList(TestERP5SimulationMixin, TestPackingList):
def validateNewRules(self): def validateNewRules(self):
# create a New Order Rule document. # create a New Order Rule document.
portal_rules = self.portal.portal_rules portal_rules = self.portal.portal_rules
...@@ -124,7 +280,6 @@ class TestERP5SimulationMixin(TestPackingListMixin): ...@@ -124,7 +280,6 @@ class TestERP5SimulationMixin(TestPackingListMixin):
if new_order_rule.getValidationState() != 'validated': if new_order_rule.getValidationState() != 'validated':
new_order_rule.validate() new_order_rule.validate()
class TestERP5Simulation(TestERP5SimulationMixin, TestPackingList):
def stepAcceptDecisionQuantity(self,sequence=None, sequence_list=None, **kw): def stepAcceptDecisionQuantity(self,sequence=None, sequence_list=None, **kw):
""" """
Solve quantity divergence by using solver tool. Solve quantity divergence by using solver tool.
...@@ -195,4 +350,5 @@ class TestERP5Simulation(TestERP5SimulationMixin, TestPackingList): ...@@ -195,4 +350,5 @@ class TestERP5Simulation(TestERP5SimulationMixin, TestPackingList):
def test_suite(): def test_suite():
suite = unittest.TestSuite() suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestERP5Simulation)) suite.addTest(unittest.makeSuite(TestERP5Simulation))
suite.addTest(unittest.makeSuite(TestERP5SimulationPackingList))
return suite return suite
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment