code: package org.logicng.solvers.functions;
  
  import static org.assertj.core.api.Assertions.assertThat;
  
  import org.junit.jupiter.api.Test;
  import org.logicng.datastructures.Assignment;
  import org.logicng.formulas.FormulaFactory;
  import org.logicng.io.parsers.ParserException;
  import org.logicng.solvers.MiniSat;
  import org.logicng.solvers.SATSolver;
  
  import java.util.List;
  
  /**
   * Units tests for {@link ModelEnumerationFunction}.
   * @version 2.3.0
   * @since 2.3.0
   */
  public class ModelEnumerationFunctionTest {
  
      private final FormulaFactory f;
  
      public ModelEnumerationFunctionTest() {
          this.f = new FormulaFactory();
      }
  
      @Test
      public void testModelEnumerationSimple() throws ParserException {
          final SATSolver solver = MiniSat.miniSat(this.f);
          solver.add(this.f.parse("A & (B | C)"));
          final List<Assignment> models = solver.execute(ModelEnumerationFunction.builder().build());
          assertThat(models).containsExactlyInAnyOrder(
                  new Assignment(this.f.variable("A"), this.f.variable("B"), this.f.variable("C")),
                  new Assignment(this.f.variable("A"), this.f.variable("B"), this.f.literal("C", false)),
                  new Assignment(this.f.variable("A"), this.f.literal("B", false), this.f.variable("C"))
          );
      }
  
      @Test
      public void testFastEvaluable() throws ParserException {
          final SATSolver solver = MiniSat.miniSat(this.f);
          solver.add(this.f.parse("A & (B | C)"));
          List<Assignment> models = solver.execute(ModelEnumerationFunction.builder().build());
          assertThat(models).extracting(Assignment::fastEvaluable).containsOnly(false);
          models = solver.execute(ModelEnumerationFunction.builder().fastEvaluable(false).build());
          assertThat(models).extracting(Assignment::fastEvaluable).containsOnly(false);
          models = solver.execute(ModelEnumerationFunction.builder().fastEvaluable(true).build());
          assertThat(models).extracting(Assignment::fastEvaluable).containsOnly(true);
      }
  }
  