diff --git a/tests/test_engine.py b/tests/test_engine.py index ce421759..b130f2f2 100644 --- a/tests/test_engine.py +++ b/tests/test_engine.py @@ -533,3 +533,21 @@ def test_render_offset(): assert str(capa.features.insn.Offset(1)) == "offset(0x1)" assert str(capa.features.insn.Offset(1, bitness=capa.features.common.BITNESS_X32)) == "offset/x32(0x1)" assert str(capa.features.insn.Offset(1, bitness=capa.features.common.BITNESS_X64)) == "offset/x64(0x1)" + + +def test_short_circuit_order(): + # base cases. + assert Or([Number(1), Number(2)]).evaluate({Number(1): {1}}) == True + assert Or([Number(1), Number(2)]).evaluate({Number(2): {1}}) == True + + # with short circuiting, only the children up until the first satisfied child are captured. + assert len(Or([Number(1), Number(2)]).evaluate({Number(1): {1}}).children) == 1 + assert len(Or([Number(1), Number(2)]).evaluate({Number(2): {1}}).children) == 2 + assert len(Or([Number(1), Number(2)]).evaluate({Number(1): {1}, Number(2): {1}}).children) == 1 + + # and its guaranteed that children are evaluated in order. + assert Or([Number(1), Number(2)]).evaluate({Number(1): {1}}).children[0].statement == Number(1) + assert Or([Number(1), Number(2)]).evaluate({Number(1): {1}}).children[0].statement != Number(2) + + assert Or([Number(1), Number(2)]).evaluate({Number(2): {1}}).children[1].statement == Number(2) + assert Or([Number(1), Number(2)]).evaluate({Number(2): {1}}).children[1].statement != Number(1)