def test_evaluate_assumes__OR_operator__when_first_item_in_array_not_recognized_operator(
            self):
        """ Test that by default OR operator is assumed when the first item in conditions is not
        a recognized operator. """

        leafEvaluator = mock.MagicMock(side_effect=[False, True])

        self.assertStrictTrue(
            evaluate([conditionA, conditionB], lambda a: leafEvaluator()))

        self.assertStrictFalse(
            evaluate([conditionA, conditionB], lambda a: False))
    def test_and_evaluator__returns_null__when_trues_and_null(self):
        """ Test that and_evaluator returns when operands evaluate to trues and null. """

        leafEvaluator = mock.MagicMock(side_effect=[True, None])

        self.assertIsNone(
            evaluate(['and', conditionA, conditionB],
                     lambda a: leafEvaluator()))

        leafEvaluator = mock.MagicMock(side_effect=[None, True])

        self.assertIsNone(
            evaluate(['and', conditionA, conditionB],
                     lambda a: leafEvaluator()))
    def test_and_evaluator__returns_false__when_falses_and_null(self):
        """ Test that and_evaluator returns False when when operands evaluate to falses and null. """

        leafEvaluator = mock.MagicMock(side_effect=[False, None])

        self.assertStrictFalse(
            evaluate(['and', conditionA, conditionB],
                     lambda a: leafEvaluator()))

        leafEvaluator = mock.MagicMock(side_effect=[None, False])

        self.assertStrictFalse(
            evaluate(['and', conditionA, conditionB],
                     lambda a: leafEvaluator()))
  def test_evaluate_assumes__OR_operator__when_first_item_in_array_not_recognized_operator(self):
    """ Test that by default OR operator is assumed when the first item in conditions is not
        a recognized operator. """

    leafEvaluator = mock.MagicMock(side_effect=[False, True])

    self.assertStrictTrue(evaluate(
      [conditionA, conditionB],
      lambda a: leafEvaluator()
    ))

    self.assertStrictFalse(evaluate(
      [conditionA, conditionB],
      lambda a: False
    ))
  def test_and_evaluator__returns_null__when_trues_and_null(self):
    """ Test that and_evaluator returns when operands evaluate to trues and null. """

    leafEvaluator = mock.MagicMock(side_effect=[True, None])

    self.assertIsNone(evaluate(
      ['and', conditionA, conditionB],
      lambda a: leafEvaluator()
    ))

    leafEvaluator = mock.MagicMock(side_effect=[None, True])

    self.assertIsNone(evaluate(
      ['and', conditionA, conditionB],
      lambda a: leafEvaluator()
    ))
  def test_and_evaluator__returns_true(self):
    """ Test that and_evaluator returns True when all conditions evaluate to True. """

    self.assertStrictTrue(evaluate(
      ['and', conditionA, conditionB],
      lambda a: True
    ))
  def test_and_evaluator__returns_false__when_falses_and_null(self):
    """ Test that and_evaluator returns False when when operands evaluate to falses and null. """

    leafEvaluator = mock.MagicMock(side_effect=[False, None])

    self.assertStrictFalse(evaluate(
      ['and', conditionA, conditionB],
      lambda a: leafEvaluator()
    ))

    leafEvaluator = mock.MagicMock(side_effect=[None, False])

    self.assertStrictFalse(evaluate(
      ['and', conditionA, conditionB],
      lambda a: leafEvaluator()
    ))
  def test_or_evaluator__returns_false__when_all_false(self):
    """ Test that or_evaluator returns False when all operands evaluate to False."""

    self.assertStrictFalse(evaluate(
      ['or', conditionA, conditionB],
      lambda a: False
    ))
  def test_not_evaluator__returns_null__when_there_are_no_operands(self):
    """ Test that not_evaluator returns null when there are no conditions. """

    self.assertIsNone(evaluate(
      ['not'],
      lambda a: True
    ))
  def test_not_evaluator__returns_null__when_null(self):
    """ Test that not_evaluator returns null when condition evaluates to null. """

    self.assertIsNone(evaluate(
      ['not', conditionA],
      lambda a: None
    ))
  def test_not_evaluator__returns_false(self):
    """ Test that not_evaluator returns True when condition evaluates to False. """

    self.assertStrictFalse(evaluate(
      ['not', conditionA],
      lambda a: True
    ))
  def test_and_evaluator__returns_null__when_all_null(self):
    """ Test that and_evaluator returns null when all operands evaluate to null. """

    self.assertIsNone(evaluate(
      ['and', conditionA, conditionB],
      lambda a: None
    ))
    def test_or_evaluator__returns_true__when_any_true(self):
        """ Test that or_evaluator returns True when any one condition evaluates to True. """

        leafEvaluator = mock.MagicMock(side_effect=[False, True])

        self.assertStrictTrue(
            evaluate(['or', conditionA, conditionB],
                     lambda a: leafEvaluator()))
    def test_or_evaluator__returns_true__when_trues_falses_and_null(self):
        """ Test that or_evaluator returns True when operands evaluate to trues, falses and null. """

        leafEvaluator = mock.MagicMock(side_effect=[False, None, True])

        self.assertStrictTrue(
            evaluate(['or', conditionA, conditionB, conditionC],
                     lambda a: leafEvaluator()))
    def test_and_evaluator__returns_false(self):
        """ Test that and_evaluator returns False when any one condition evaluates to False. """

        leafEvaluator = mock.MagicMock(side_effect=[True, False])

        self.assertStrictFalse(
            evaluate(['and', conditionA, conditionB],
                     lambda a: leafEvaluator()))
  def test_or_evaluator__returns_true__when_any_true(self):
    """ Test that or_evaluator returns True when any one condition evaluates to True. """

    leafEvaluator = mock.MagicMock(side_effect=[False, True])

    self.assertStrictTrue(evaluate(
      ['or', conditionA, conditionB],
      lambda a: leafEvaluator()
    ))
  def test_and_evaluator__returns_false(self):
    """ Test that and_evaluator returns False when any one condition evaluates to False. """

    leafEvaluator = mock.MagicMock(side_effect=[True, False])

    self.assertStrictFalse(evaluate(
      ['and', conditionA, conditionB],
      lambda a: leafEvaluator()
    ))
  def test_or_evaluator__returns_true__when_trues_falses_and_null(self):
    """ Test that or_evaluator returns True when operands evaluate to trues, falses and null. """

    leafEvaluator = mock.MagicMock(side_effect=[False, None, True])

    self.assertStrictTrue(evaluate(
      ['or', conditionA, conditionB, conditionC],
      lambda a: leafEvaluator()
    ))
    def test_not_evaluator_negates_first_condition__ignores_rest(self):
        """ Test that not_evaluator negates first condition and ignores rest. """
        leafEvaluator = mock.MagicMock(side_effect=[False, True, None])

        self.assertStrictTrue(
            evaluate(['not', conditionA, conditionB, conditionC],
                     lambda a: leafEvaluator()))

        leafEvaluator = mock.MagicMock(side_effect=[True, False, None])

        self.assertStrictFalse(
            evaluate(['not', conditionA, conditionB, conditionC],
                     lambda a: leafEvaluator()))

        leafEvaluator = mock.MagicMock(side_effect=[None, True, False])

        self.assertIsNone(
            evaluate(['not', conditionA, conditionB, conditionC],
                     lambda a: leafEvaluator()))
  def test_not_evaluator_negates_first_condition__ignores_rest(self):
    """ Test that not_evaluator negates first condition and ignores rest. """
    leafEvaluator = mock.MagicMock(side_effect=[False, True, None])

    self.assertStrictTrue(evaluate(
      ['not', conditionA, conditionB, conditionC],
      lambda a: leafEvaluator()
    ))

    leafEvaluator = mock.MagicMock(side_effect=[True, False, None])

    self.assertStrictFalse(evaluate(
      ['not', conditionA, conditionB, conditionC],
      lambda a: leafEvaluator()
    ))

    leafEvaluator = mock.MagicMock(side_effect=[None, True, False])

    self.assertIsNone(evaluate(
      ['not', conditionA, conditionB, conditionC],
      lambda a: leafEvaluator()
    ))
    def test_not_evaluator__returns_null__when_there_are_no_operands(self):
        """ Test that not_evaluator returns null when there are no conditions. """

        self.assertIsNone(evaluate(['not'], lambda a: True))
    def test_and_evaluator__returns_null__when_all_null(self):
        """ Test that and_evaluator returns null when all operands evaluate to null. """

        self.assertIsNone(
            evaluate(['and', conditionA, conditionB], lambda a: None))
  def test_evaluate__returns_true(self):
    """ Test that evaluate returns True when the leaf condition evaluator returns True. """

    self.assertStrictTrue(evaluate(conditionA, lambda a: True))
    def test_and_evaluator__returns_true(self):
        """ Test that and_evaluator returns True when all conditions evaluate to True. """

        self.assertStrictTrue(
            evaluate(['and', conditionA, conditionB], lambda a: True))
    def test_evaluate__returns_false(self):
        """ Test that evaluate returns False when the leaf condition evaluator returns False. """

        self.assertStrictFalse(evaluate(conditionA, lambda a: False))
    def test_evaluate__returns_true(self):
        """ Test that evaluate returns True when the leaf condition evaluator returns True. """

        self.assertStrictTrue(evaluate(conditionA, lambda a: True))
  def test_evaluate__returns_false(self):
    """ Test that evaluate returns False when the leaf condition evaluator returns False. """

    self.assertStrictFalse(evaluate(conditionA, lambda a: False))
    def test_not_evaluator__returns_null__when_null(self):
        """ Test that not_evaluator returns null when condition evaluates to null. """

        self.assertIsNone(evaluate(['not', conditionA], lambda a: None))
    def test_not_evaluator__returns_false(self):
        """ Test that not_evaluator returns True when condition evaluates to False. """

        self.assertStrictFalse(evaluate(['not', conditionA], lambda a: True))
    def test_or_evaluator__returns_false__when_all_false(self):
        """ Test that or_evaluator returns False when all operands evaluate to False."""

        self.assertStrictFalse(
            evaluate(['or', conditionA, conditionB], lambda a: False))