// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import "package:expect/expect.dart"; import "package:status_file/src/expression.dart"; import 'package:status_file/src/disjunctive.dart'; main() { testDnf(); } void shouldDnfTo(String input, String expected) { var expression = Expression.parse(input); Expect.equals(expected, toDisjunctiveNormalForm(expression).toString()); } void shouldDnfToExact(String input, Expression expected) { var expression = Expression.parse(input); Expect.equals(expected, toDisjunctiveNormalForm(expression)); } void shouldBeSame(String input) { shouldDnfTo(input, input); } void testDnf() { shouldBeSame(r'$a'); shouldBeSame(r'$a || $b'); shouldBeSame(r'$a || $b && $c'); shouldBeSame(r'$a && $b || $b && $c'); shouldBeSame(r'$a && $b && $c'); shouldBeSame(r'$a || $b || $c'); shouldBeSame(r'!$a'); shouldBeSame(r'!$a && $b'); shouldBeSame(r'$a && !$b'); shouldBeSame(r'$a && $b'); shouldBeSame(r'!$a && !$b'); // Testing True. shouldDnfToExact(r'$a || !$a', T); shouldDnfToExact(r'!$a || !$b || $a && $b', T); // Testing False shouldDnfToExact(r'$a && !$a', F); shouldDnfToExact(r'($a || $b) && !$a && !$b', F); // Testing dnf and simple minimization (duplicates). shouldDnfTo(r'$a && ($b || $c)', r'$a && $b || $a && $c'); shouldDnfTo(r'($a || $b) && ($c || $d)', r'$a && $c || $a && $d || $b && $c || $b && $d'); // Testing minimizing by complementation // The following two examples can be found here: // https://en.wikipedia.org/wiki/Quine%E2%80%93McCluskey_algorithm shouldDnfTo( r"$a && !$b && !$c && !$d || $a && !$b && !$c && $d || " r"$a && !$b && $c && !$d || $a && !$b && $c && $d", r"$a && !$b"); shouldDnfTo( r"!$a && $b && !$c && !$d || $a && !$b && !$c && !$d || " r"$a && !$b && $c && !$d || $a && !$b && $c && $d || $a && $b && !$c && !$d ||" r" $a && $b && $c && $d || $a && !$b && !$c && $d || $a && $b && $c && !$d", r"$a && !$b || $a && $c || $b && !$c && !$d"); // Test that an expression is converted to dnf and minified correctly. shouldDnfTo(r'($a || $b) && ($a || $c)', r'$a || $b && $c'); shouldDnfTo(r'(!$a || $b) && ($a || $b)', r'$b'); shouldDnfTo(r'($a || $b || $c) && (!$a || !$b)', r'$a && !$b || !$a && $b || !$b && $c'); }