def dd(c_pass, c_fail, test, splitter = None): """Return a triple (DELTA, C_PASS', C_FAIL') such that - C_PASS subseteq C_PASS' subset C_FAIL' subseteq C_FAIL holds - DELTA = C_FAIL' - C_PASS' is a minimal difference between C_PASS' and C_FAIL' that is relevant with respect to TEST.""" if splitter is None: splitter = split.split n = 2 while 1: assert test(c_pass) == PASS assert test(c_fail) == FAIL assert n >= 2 delta = listminus(c_fail, c_pass) if n > len(delta): # No further minimizing return (delta, c_pass, c_fail) deltas = splitter(delta, n) assert len(deltas) == n offset = 0 j = 0 while j < n: i = (j + offset) % n next_c_pass = listunion(c_pass, deltas[i]) next_c_fail = listminus(c_fail, deltas[i]) if test(next_c_fail) == FAIL and n == 2: c_fail = next_c_fail n = 2; offset = 0; break elif test(next_c_fail) == PASS: c_pass = next_c_fail n = 2; offset = 0; break elif test(next_c_pass) == FAIL: c_fail = next_c_pass n = 2; offset = 0; break elif test(next_c_fail) == FAIL: c_fail = next_c_fail n = max(n - 1, 2); offset = i; break elif test(next_c_pass) == PASS: c_pass = next_c_pass n = max(n - 1, 2); offset = i; break else: j = j + 1 if j >= n: if n >= len(delta): return (delta, c_pass, c_fail) else: n = min(len(delta), n * 2)
def ddmin(circumstances, test): """Return a sublist of CIRCUMSTANCES that is a relevant configuration with respect to TEST.""" assert test([]) == PASS assert test(circumstances) == FAIL n = 2 while len(circumstances) >= 2: subsets = split(circumstances, n) assert len(subsets) == n some_complement_is_failing = 0 for subset in subsets: complement = listminus(circumstances, subset) if test(complement) == FAIL: circumstances = complement n = max(n - 1, 2) some_complement_is_failing = 1 break if not some_complement_is_failing: if n == len(circumstances): break n = min(n * 2, len(circumstances)) return circumstances
def ddmin(circumstances, test): """Return a sublist of CIRCUMSTANCES that is a relevant configuration with respect to TEST.""" assert test([]) == UNRESOLVED assert test(circumstances) == FAIL n = 2 while len(circumstances) >= 2: subsets = split(circumstances, n) assert len(subsets) == n some_complement_is_failing = 0 for subset in subsets: complement = listminus(circumstances, subset) if test(complement) == FAIL: circumstances = complement n = max(n - 1, 2) some_complement_is_failing = 1 break if not some_complement_is_failing: if n == len(circumstances): break n = min(n * 2, len(circumstances)) return circumstances
def ddmin(circumstances, test): """Return a sublist of CIRCUMSTANCES that is a relevant configuration with respect to TEST.""" n = 2 while len(circumstances) >= 2: subsets = split(circumstances, n) some_complement_is_failing = 0 for subset in subsets: complement = listminus(circumstances, subset) file = open('complement.xml', 'w') for c in complement: file.write(c[1]) file.close() if test('complement.xml') == FAIL: circumstances = complement n = max(n - 1, 2) some_complement_is_failing = 1 break if not some_complement_is_failing: if n == len(circumstances): break n = min(n * 2, len(circumstances)) os.remove('complement.xml') return circumstances
def remove_funcs(): for k in fs.keys(): subset = codes_to_input(listminus(codes, fs[k])) if FAIL in test(subset, k): for l in fs[k]: codes.remove(l) del fs[k]
def trace(cf, traced): def line_has_func(line, traced): for k in fs.keys(): if k in line.code and cf != k and not traced[k]: nfs.append(k) traced[cf] = True for line in reversed(fs[cf]): subset = codes_to_input(listminus(codes, [line])) if FAIL in test(subset, line.no): codes.remove(line) else: line_has_func(line, traced) return traced
def remove_condition(): for i in range(1, 10): # indent layer cond_codes = None for l in codes: if re.search("^\t{{{}}}(if|while)".format(i), l.code): cond_codes = [] cond_codes.append(l) elif re.search("^\t{{{}}}".format(i+1), l.code): if cond_codes != None: cond_codes.append(l) else: if cond_codes == None: continue subset = codes_to_input(listminus(codes, cond_codes)) if FAIL in test(subset, "if_" + str(cond_codes[0].no)): for l in cond_codes: codes.remove(l) cond_codes = None
def remove_condition(): for i in range(1, 10): # indent layer cond_codes = None for l in codes: if re.search("^\t{{{}}}(if|while)".format(i), l.code): cond_codes = [] cond_codes.append(l) elif re.search("^\t{{{}}}".format(i + 1), l.code): if cond_codes != None: cond_codes.append(l) else: if cond_codes == None: continue subset = codes_to_input(listminus(codes, cond_codes)) if FAIL in test(subset, "if_" + str(cond_codes[0].no)): for l in cond_codes: codes.remove(l) cond_codes = None
def ddmin(circumstances, test): """Return a sublist of CIRCUMSTANCES that is a relevant configuration with respect to TEST.""" #assert test([]) == PASS #assert test(circumstances) == FAIL #print "ddmin: Entry" #print "circumstances: ", circumstances #print "test: ", test n = 2 while len(circumstances) >= 2: subsets = split(circumstances, n) assert len(subsets) == n #print "ddmin: subsets ", subsets some_complement_is_failing = 0 for subset in subsets: complement = listminus(circumstances, subset) #print "ddmin: complement: ", complement #if test(complement) == FAIL: if test(complement) == PASS: circumstances = complement n = max(n - 1, 2) some_complement_is_failing = 1 break if not some_complement_is_failing: if n == len(circumstances): break n = min(n * 2, len(circumstances)) #print "Circumstances: ", circumstances #print "ddmin: Exit" return circumstances
def ddmin(circumstances, test, target): global LOG """Return a sublist of CIRCUMSTANCES that is a relevant configuration with respect to TEST.""" assert test([]) == PASS assert test(circumstances) == FAIL n = 2 while len(circumstances) >= 2: subsets = split(circumstances, n) assert len(subsets) == n some_complement_is_failing = 0 for subset in subsets: complement = listminus(circumstances, subset) if test(complement) == FAIL: circumstances = complement n = max(n - 1, 2) some_complement_is_failing = 1 break else: if test(complement) == FAIL: LOG.write("undeterministic event detect") os.system("mv dd_test_tmp undeterministic_input.dat") p = subprocess.Popen(["bash", 'mt_trace.sh', target], stdin=subprocess.PIPE) p.communicate() exit(0) if not some_complement_is_failing: if n == len(circumstances): break n = min(n * 2, len(circumstances)) return circumstances
def dd(c_pass, c_fail, test, splitter = None): """Return a triple (DELTA, C_PASS', C_FAIL') such that - C_PASS subseteq C_PASS' subset C_FAIL' subseteq C_FAIL holds - DELTA = C_FAIL' - C_PASS' is a minimal difference between C_PASS' and C_FAIL' that is relevant with respect to TEST.""" if splitter is None: splitter = split.split n = 2 while 1: delta = listminus(c_fail, c_pass) if n > len(delta): # No further minimizing return (delta, c_pass, c_fail) deltas = splitter(delta, n) offset = 0 j = 0 while j < n: i = (j + offset) % n next_c_pass = listunion(c_pass, deltas[i]) next_c_fail = listminus(c_fail, deltas[i]) file = open('next_c_pass.xml', 'w') for c in next_c_pass: file.write(c[1]) file.close() file = open('next_c_fail.xml', 'w') for c in next_c_pass: file.write(c[1]) file.close() if test('next_c_fail.xml') == FAIL and n == 2: c_fail = next_c_fail n = 2 offset = 0 break elif test('next_c_fail.xml') == PASS: c_pass = next_c_fail n = 2 offset = 0 break elif test('next_c_pass.xml') == FAIL: c_fail = next_c_pass n = 2 offset = 0 break elif test('next_c_fail.xml') == FAIL: c_fail = next_c_fail n = max(n - 1, 2) offset = i break elif test('next_c_pass.xml') == PASS: c_pass = next_c_pass n = max(n - 1, 2) offset = i break else: j = j + 1 os.remove('next_c_pass.xml') os.remove('next_c_fail.xml') if j >= n: if n >= len(delta): return (delta, c_pass, c_fail) else: n = min(len(delta), n * 2)