예제 #1
0
파일: dd.py 프로젝트: fjferrer/books
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)
예제 #2
0
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
예제 #3
0
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
예제 #4
0
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
예제 #5
0
파일: ddmin.py 프로젝트: melbcat/sdg_final
 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]
예제 #6
0
 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]
예제 #7
0
파일: ddmin.py 프로젝트: melbcat/sdg_final
    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 
예제 #8
0
    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
예제 #9
0
파일: ddmin.py 프로젝트: melbcat/sdg_final
 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
예제 #10
0
 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
예제 #11
0
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
예제 #12
0
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
예제 #13
0
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)