code: def test_ruleset_modifications(self):
      self.reset_values()
  
      # Adding to empty ruleset
      rs = ruleset.DnfRuleSet([], "ThenPart")
      rs.add_conjunction(self.conjunction1)
      self.assertListEqual(rs.list_conjunctions(), [self.conjunction1])
  
      # Adding a duplicate conjunction
      rs = ruleset.DnfRuleSet([self.conjunction1], "ThenPart")
      rs.add_conjunction(self.conjunction3)
      self.assertListEqual(rs.list_conjunctions(), [self.conjunction1])
  
      # Removing a conjunction
      rs = ruleset.DnfRuleSet(
          [self.conjunction1, self.conjunction4], "ThenPart"
      )
      rs.remove_conjunction(self.conjunction1)
      self.assertListEqual(rs.list_conjunctions(), [self.conjunction4])
  
      # Removing a conjunction that does not exist
      rs = ruleset.DnfRuleSet(
          [self.conjunction1, self.conjunction4], "ThenPart"
      )
      self.assertRaises(
          ValueError, rs.remove_conjunction, self.conjunction2
      )
  
file_path: AIX360/tests/rule_induction/trxf/core/test_dnfruleset.py
imports: from unittest import TestCase
  from aix360.algorithms.rule_induction.trxf.core.feature import Feature
  import aix360.algorithms.rule_induction.trxf.core.predicate
  import aix360.algorithms.rule_induction.trxf.core.conjunction
  import aix360.algorithms.rule_induction.trxf.core.dnf_ruleset
label_desc: Use image node_id 3 for calling the TestDnfRuleSet obj's underlying member method code with example usage: obj.test_ruleset_modifications() without return types