testgenie-py 0.3.0__tar.gz → 0.3.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/PKG-INFO +1 -1
  2. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/pyproject.toml +1 -1
  3. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/analyzer/ast_analyzer.py +0 -1
  4. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/controller/cli_controller.py +9 -0
  5. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/controller/docker_controller.py +9 -1
  6. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/generator/doctest_generator.py +0 -1
  7. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/service/service.py +33 -0
  8. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/testgen.db +0 -0
  9. testgenie_py-0.3.0/testgen/.coverage +0 -0
  10. testgenie_py-0.3.0/testgen/code_to_test/boolean.py +0 -146
  11. testgenie_py-0.3.0/testgen/code_to_test/calculator.py +0 -29
  12. testgenie_py-0.3.0/testgen/code_to_test/code_to_fuzz.py +0 -329
  13. testgenie_py-0.3.0/testgen/code_to_test/code_to_fuzz_lite.py +0 -397
  14. testgenie_py-0.3.0/testgen/code_to_test/decisions.py +0 -57
  15. testgenie_py-0.3.0/testgen/code_to_test/math_utils.py +0 -47
  16. testgenie_py-0.3.0/testgen/code_to_test/sample_code_bin.py +0 -141
  17. testgenie_py-0.3.0/testgen/tests/test_code_to_fuzz.py +0 -263
  18. testgenie_py-0.3.0/testgen/util/__init__.py +0 -0
  19. testgenie_py-0.3.0/testgen/util/z3_utils/__init__.py +0 -0
  20. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/README.md +0 -0
  21. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/__init__.py +0 -0
  22. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/analyzer/__init__.py +0 -0
  23. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/analyzer/contracts/__init__.py +0 -0
  24. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/analyzer/contracts/contract.py +0 -0
  25. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/analyzer/contracts/no_exception_contract.py +0 -0
  26. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/analyzer/contracts/nonnull_contract.py +0 -0
  27. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/analyzer/fuzz_analyzer.py +0 -0
  28. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/analyzer/random_feedback_analyzer.py +0 -0
  29. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/analyzer/reinforcement_analyzer.py +0 -0
  30. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/analyzer/test_case_analyzer.py +0 -0
  31. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/analyzer/test_case_analyzer_context.py +0 -0
  32. {testgenie_py-0.3.0/testgen/code_to_test → testgenie_py-0.3.1/testgen/controller}/__init__.py +0 -0
  33. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/docker/Dockerfile +0 -0
  34. {testgenie_py-0.3.0/testgen/controller → testgenie_py-0.3.1/testgen/generator}/__init__.py +0 -0
  35. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/generator/code_generator.py +0 -0
  36. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/generator/generator.py +0 -0
  37. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/generator/pytest_generator.py +0 -0
  38. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/generator/test_generator.py +0 -0
  39. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/generator/unit_test_generator.py +0 -0
  40. {testgenie_py-0.3.0/testgen/generator → testgenie_py-0.3.1/testgen/inspector}/__init__.py +0 -0
  41. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/inspector/inspector.py +0 -0
  42. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/main.py +0 -0
  43. {testgenie_py-0.3.0/testgen/inspector → testgenie_py-0.3.1/testgen/models}/__init__.py +0 -0
  44. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/models/analysis_context.py +0 -0
  45. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/models/function_metadata.py +0 -0
  46. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/models/generator_context.py +0 -0
  47. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/models/test_case.py +0 -0
  48. {testgenie_py-0.3.0/testgen/models → testgenie_py-0.3.1/testgen/presentation}/__init__.py +0 -0
  49. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/presentation/cli_view.py +0 -0
  50. {testgenie_py-0.3.0/testgen/presentation → testgenie_py-0.3.1/testgen/reinforcement}/__init__.py +0 -0
  51. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/reinforcement/abstract_state.py +0 -0
  52. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/reinforcement/agent.py +0 -0
  53. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/reinforcement/environment.py +0 -0
  54. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/reinforcement/statement_coverage_state.py +0 -0
  55. {testgenie_py-0.3.0/testgen/reinforcement → testgenie_py-0.3.1/testgen/service}/__init__.py +0 -0
  56. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/service/analysis_service.py +0 -0
  57. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/service/cfg_service.py +0 -0
  58. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/service/generator_service.py +0 -0
  59. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/service/logging_service.py +0 -0
  60. {testgenie_py-0.3.0/testgen/service → testgenie_py-0.3.1/testgen/sqlite}/__init__.py +0 -0
  61. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/sqlite/db.py +0 -0
  62. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/sqlite/db_service.py +0 -0
  63. {testgenie_py-0.3.0/testgen/sqlite → testgenie_py-0.3.1/testgen/tree}/__init__.py +0 -0
  64. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/tree/node.py +0 -0
  65. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/tree/tree_utils.py +0 -0
  66. {testgenie_py-0.3.0/testgen/tests → testgenie_py-0.3.1/testgen/util}/__init__.py +0 -0
  67. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/util/coverage_utils.py +0 -0
  68. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/util/coverage_visualizer.py +0 -0
  69. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/util/file_utils.py +0 -0
  70. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/util/randomizer.py +0 -0
  71. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/util/utils.py +0 -0
  72. {testgenie_py-0.3.0/testgen/tree → testgenie_py-0.3.1/testgen/util/z3_utils}/__init__.py +0 -0
  73. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/util/z3_utils/ast_to_z3.py +0 -0
  74. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/util/z3_utils/branch_condition.py +0 -0
  75. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/util/z3_utils/constraint_extractor.py +0 -0
  76. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/util/z3_utils/variable_finder.py +0 -0
  77. {testgenie_py-0.3.0 → testgenie_py-0.3.1}/testgen/util/z3_utils/z3_test_case.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: testgenie-py
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: Automated unit test generation tool for Python.
5
5
  Author: cjseitz
6
6
  Author-email: charlesjseitz@gmail.com
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "testgenie-py"
3
- version = "0.3.0"
3
+ version = "0.3.1"
4
4
  description = "Automated unit test generation tool for Python."
5
5
  authors = ["cjseitz <charlesjseitz@gmail.com>"]
6
6
  readme = "README.md"
@@ -56,7 +56,6 @@ class ASTAnalyzer(TestCaseAnalyzerStrategy, ABC):
56
56
  generated_file = function_metadata.filename
57
57
  module = testgen.util.file_utils.load_module(generated_file)
58
58
 
59
- # Check if we're dealing with a class
60
59
  if function_metadata.class_name:
61
60
  cls = getattr(module, function_metadata.class_name)
62
61
  instance = cls()
@@ -46,6 +46,10 @@ class CLIController:
46
46
  print(f"Querying database for file: {args.file_path}")
47
47
  self.service.query_test_file_data(args.file_path)
48
48
  return
49
+
50
+ if args.coverage:
51
+ self.service.get_coverage(args.file_path)
52
+ return
49
53
 
50
54
  running_in_docker = os.environ.get("RUNNING_IN_DOCKER") is not None
51
55
  if running_in_docker:
@@ -159,6 +163,11 @@ class CLIController:
159
163
  type=str,
160
164
  help="Path to log file (if not specified, logs will only go to console)"
161
165
  )
166
+ parser.add_argument(
167
+ "-c", "--coverage",
168
+ action="store_true",
169
+ help="Run coverage analysis on the generated tests"
170
+ )
162
171
  return parser
163
172
 
164
173
  def set_test_format(self, args: argparse.Namespace):
@@ -35,12 +35,20 @@ class DockerController:
35
35
 
36
36
  # Check if Docker image exists, build it if not
37
37
  image_name = "testgen-runner"
38
- # If args.safe is set to false it means the image was not found and the system will try to run_locally
39
38
  self.get_image(docker_client, image_name, project_root)
40
39
  if not self.args.safe:
41
40
  self.logger.info("Docker image not found. Running locally...")
42
41
  return False
43
42
 
43
+ src_path = os.path.abspath(args.file_path)
44
+ dest_path = os.path.join(project_root, os.path.basename(src_path))
45
+ try:
46
+ shutil.copy(src_path, dest_path)
47
+ self.logger.debug(f"Copied file from {src_path} to {dest_path}")
48
+ except Exception as e:
49
+ self.logger.error(f"Failed to copy file: {e}")
50
+ sys.exit(1)
51
+
44
52
  docker_args = [args.file_path] + [arg for arg in sys.argv[2:] if arg != "--safe"]
45
53
  docker_args[0] = f"/controller/testgen/code_to_test/{os.path.basename(docker_args[0])}"
46
54
 
@@ -9,7 +9,6 @@ class DocTestGenerator(TestGenerator):
9
9
  def __init__(self, generator_context: GeneratorContext):
10
10
  super().__init__(generator_context)
11
11
 
12
- # Implementing abstract methods from TestGenerator
13
12
  def generate_test_header(self):
14
13
  pass
15
14
 
@@ -8,6 +8,8 @@ import sqlite3
8
8
  import sys
9
9
  import time
10
10
  import subprocess
11
+
12
+ import coverage
11
13
  import testgen.util.coverage_utils as coverage_utils
12
14
  from types import ModuleType
13
15
  from typing import List
@@ -163,6 +165,7 @@ class Service:
163
165
  text=True
164
166
  )
165
167
  coverage_output = result.stdout
168
+ print(coverage_output)
166
169
  elif self.test_format == PYTEST_FORMAT:
167
170
  self.execute_and_store_pytest(test_file)
168
171
  elif self.test_format == DOCTEST_FORMAT:
@@ -312,6 +315,36 @@ class Service:
312
315
  """Create an analysis context for the given file."""
313
316
  return self.analysis_service.create_analysis_context(filepath)
314
317
 
318
+ def get_coverage(self, file_path: str):
319
+ """
320
+ Use the coverage library to calculate and print the coverage for the specified Python file.
321
+ Dynamically determine the source directory based on the file being tested.
322
+ """
323
+ # Dynamically determine the source directory
324
+ source_dir = os.path.dirname(file_path)
325
+ cov = coverage.Coverage(source=[source_dir]) # Use the directory of the file as the source
326
+ cov.start()
327
+
328
+ try:
329
+ # Dynamically import and execute the specified file
330
+ file_name = os.path.basename(file_path)
331
+ module_name = file_name.rstrip(".py")
332
+ spec = importlib.util.spec_from_file_location(module_name, file_path)
333
+ module = importlib.util.module_from_spec(spec)
334
+ spec.loader.exec_module(module)
335
+
336
+ except Exception as e:
337
+ print(f"Error while executing the file: {e}")
338
+ return
339
+
340
+ finally:
341
+ cov.stop()
342
+ cov.save()
343
+
344
+ # Report the coverage
345
+ print(f"Coverage report for {file_path}:")
346
+ cov.report(file=sys.stdout)
347
+
315
348
  @staticmethod
316
349
  def wait_for_file(file_path, retries=5, delay=1):
317
350
  """Wait for the generated file to appear."""
Binary file
@@ -1,146 +0,0 @@
1
- from typing import List
2
-
3
-
4
- def bin_and(a: bool, b: bool) ->bool:
5
- """
6
- >>> bin_and(True, False)
7
- False
8
-
9
- >>> bin_and(False, True)
10
- False
11
-
12
- >>> bin_and(False, False)
13
- False
14
-
15
- >>> bin_and(True, True)
16
- True
17
- """
18
- if a == True:
19
- if b == True:
20
- return True
21
- else:
22
- return False
23
- else:
24
- return False
25
-
26
-
27
- def bin_xor(a: bool, b: bool) ->bool:
28
- """
29
- >>> bin_xor(True, True)
30
- False
31
-
32
- >>> bin_xor(True, False)
33
- True
34
-
35
- >>> bin_xor(False, False)
36
- False
37
-
38
- >>> bin_xor(False, True)
39
- True
40
- """
41
- if a == True:
42
- if b == True:
43
- return False
44
- else:
45
- return True
46
- elif b == True:
47
- return True
48
- else:
49
- return False
50
-
51
-
52
- def status_flags(active: bool, verified: bool, admin: bool) ->str:
53
- """
54
- >>> status_flags(False, False, False)
55
- 'inactive'
56
-
57
- >>> status_flags(False, False, True)
58
- 'admin-unverified'
59
-
60
- >>> status_flags(True, True, False)
61
- 'user-verified'
62
-
63
- >>> status_flags(True, True, True)
64
- 'admin-verified'
65
-
66
- >>> status_flags(True, False, False)
67
- 'user-unverified'
68
-
69
- >>> status_flags(False, True, True)
70
- 'admin-verified'
71
-
72
- >>> status_flags(False, True, False)
73
- 'inactive'
74
-
75
- >>> status_flags(True, False, True)
76
- 'admin-unverified'
77
- """
78
- if admin:
79
- if verified:
80
- return 'admin-verified'
81
- else:
82
- return 'admin-unverified'
83
- elif active:
84
- if verified:
85
- return 'user-verified'
86
- else:
87
- return 'user-unverified'
88
- else:
89
- return 'inactive'
90
-
91
-
92
- """def half_adder(a: bool, b: bool) ->tuple:
93
- sum: bool = bin_xor(a, b)
94
- carry: bool = bin_and(a, b)
95
- return sum, carry
96
-
97
-
98
- def full_adder(a: bool, b: bool, carry_in: bool) ->tuple:
99
- sum1, carry = half_adder(a, b)
100
- sum2, carry_out = half_adder(sum1, carry_in)
101
- return sum2, carry or carry_out
102
-
103
-
104
- def thirty_two_bit_adder_excep(x: int, y: int) ->List[int]:
105
- x_bits: List[int] = bit_converter(x)
106
- y_bits: List[int] = bit_converter(y)
107
- result: List[int] = [0] * 32
108
- carry: bool = False
109
- for i in range(32):
110
- try:
111
- sum_bit, carry = full_adder(x_bits[i], y_bits[i], carry)
112
- result[i] = sum_bit
113
- except IndexError as e:
114
- print(f'Index Out of Bounds Error In ThirtyTwoBitAdder: {e}')
115
- result = [1] * 32
116
- if carry:
117
- return OverflowError('Sum exceeds 32 bits')
118
- return result
119
-
120
-
121
- def thirty_two_bit_adder(x: int, y: int) ->List[int]:
122
- print(x.bit_length() - 1)
123
- print(y.bit_length() - 1)
124
- x_bits: List[int] = bit_converter(x)
125
- y_bits: List[int] = bit_converter(y)
126
- result: List[int] = [0] * 32
127
- carry: bool = False
128
- for i in range(32):
129
- sum_bit, carry = full_adder(x_bits[i], y_bits[i], carry)
130
- result[i] = sum_bit
131
- return result
132
-
133
- def bit_converter(num: int) ->List[int]:
134
- binary_str: str = bin(num)[2:]
135
- print(bin(num)[2:])
136
- return [int(digit) for digit in binary_str]
137
-
138
- def thirty_two_bit_adder_excep(x: int, y: int) ->List[int]:
139
- x_bits: List[int] = bit_converter(x)
140
- y_bits: List[int] = bit_converter(y)
141
- result: List[int] = [0] * 32
142
- carry: bool = False
143
- for i in range(32):
144
- sum_bit, carry = full_adder(x_bits[i], y_bits[i], carry)
145
- result[i] = sum_bit
146
- return result"""
@@ -1,29 +0,0 @@
1
- class AdvancedCalculator:
2
-
3
- def evaluate(self, a: int, b: int, op: str) ->(int | float | str):
4
- """>>> AdvancedCalculator().evaluate(16, 56, 'abc')
5
- 'invalid'"""
6
- if op == 'add':
7
- return a + b
8
- elif op == 'sub':
9
- return a - b
10
- elif op == 'mul':
11
- return a * b
12
- elif op == 'div':
13
- if b == 0:
14
- return 'undefined'
15
- return a / b
16
- else:
17
- return 'invalid'
18
-
19
- def is_in_range(self, val: float) ->str:
20
- """>>> AdvancedCalculator().is_in_range(0.4023417704905361)
21
- 'fractional'"""
22
- if val < 0.0:
23
- return 'below zero'
24
- elif 0.0 <= val < 1.0:
25
- return 'fractional'
26
- elif 1.0 <= val <= 100.0:
27
- return 'valid'
28
- else:
29
- return 'out of range'
@@ -1,329 +0,0 @@
1
- def random_fuzz_code(x: int, y: int) -> int:
2
- result = x
3
- if x < y:
4
- result += y
5
- else:
6
- result -= y
7
- return result
8
-
9
-
10
- def bin_and(a: bool, b: bool) -> bool:
11
- if a == True:
12
- if b == True:
13
- return True
14
- else:
15
- return False
16
- else:
17
- return False
18
-
19
-
20
- def pos_or_neg(i: int):
21
- if i > 0:
22
- sgn = 1
23
- else:
24
- sgn = -1
25
- if sgn > 0:
26
- return 1
27
- elif sgn < 0:
28
- return -1
29
- # else sgn == 0
30
- # no return here
31
-
32
-
33
- def int_even(x: int):
34
- if x % 2 == 0:
35
- return True
36
- else:
37
- return False
38
-
39
- def http_code(code: int) ->str:
40
- if code < 100 or code > 599:
41
- return 'invalid'
42
- elif 100 <= code < 200:
43
- return 'informational'
44
- elif 200 <= code < 300:
45
- return 'success'
46
- elif 300 <= code < 400:
47
- return 'redirection'
48
- elif 400 <= code < 500:
49
- return 'client error'
50
- else:
51
- return 'server error'
52
-
53
- def add_or_subtract(x: int, y: int) ->int:
54
- result = x
55
- if x < y:
56
- result += y
57
- else:
58
- result -= y
59
- return result
60
-
61
- def bin_and_bad_generated_function(a: bool, b: bool):
62
- if a == True:
63
- if b == True:
64
- return True
65
- else:
66
- return True
67
- else:
68
- if b == True:
69
- return True
70
- else:
71
- return False
72
-
73
-
74
- def bin_nand_generated_function(a: bool, b: bool):
75
- if a == True:
76
- if b == True:
77
- return False
78
- else:
79
- return True
80
- else:
81
- if b == True:
82
- return True
83
- else:
84
- return True
85
-
86
-
87
- def bin_nor_generated_function(a: bool, b: bool):
88
- if a == True:
89
- if b == True:
90
- return False
91
- else:
92
- return False
93
- else:
94
- if b == True:
95
- return False
96
- else:
97
- return True
98
-
99
-
100
- def bin_or_generated_function(a: bool, b: bool):
101
- if a == True:
102
- if b == True:
103
- return True
104
- else:
105
- return True
106
- else:
107
- if b == True:
108
- return True
109
- else:
110
- return False
111
-
112
-
113
- def bin_or_bad_generated_function(a: bool, b: bool):
114
- if a == True:
115
- if b == True:
116
- return False
117
- else:
118
- return False
119
- else:
120
- if b == True:
121
- return False
122
- else:
123
- return True
124
-
125
-
126
- def bin_xor_generated_function(a: bool, b: bool):
127
- if a == True:
128
- if b == True:
129
- return False
130
- else:
131
- return True
132
- else:
133
- if b == True:
134
- return True
135
- else:
136
- return False
137
-
138
-
139
- def mux_generated_function(c1: bool, c2: bool, x0: bool, x1: bool, x2: bool, x3: bool):
140
- if c1 == True:
141
- if c2 == True:
142
- if x0 == True:
143
- if x1 == True:
144
- if x2 == True:
145
- if x3 == True:
146
- return True
147
- else:
148
- return True
149
- else:
150
- if x3 == True:
151
- return True
152
- else:
153
- return True
154
- else:
155
- if x2 == True:
156
- if x3 == True:
157
- return True
158
- else:
159
- return True
160
- else:
161
- if x3 == True:
162
- return True
163
- else:
164
- return True
165
- else:
166
- if x1 == True:
167
- if x2 == True:
168
- if x3 == True:
169
- return False
170
- else:
171
- return False
172
- else:
173
- if x3 == True:
174
- return False
175
- else:
176
- return False
177
- else:
178
- if x2 == True:
179
- if x3 == True:
180
- return False
181
- else:
182
- return False
183
- else:
184
- if x3 == True:
185
- return False
186
- else:
187
- return False
188
- else:
189
- if x0 == True:
190
- if x1 == True:
191
- if x2 == True:
192
- if x3 == True:
193
- return True
194
- else:
195
- return True
196
- else:
197
- if x3 == True:
198
- return True
199
- else:
200
- return True
201
- else:
202
- if x2 == True:
203
- if x3 == True:
204
- return False
205
- else:
206
- return False
207
- else:
208
- if x3 == True:
209
- return False
210
- else:
211
- return False
212
- else:
213
- if x1 == True:
214
- if x2 == True:
215
- if x3 == True:
216
- return True
217
- else:
218
- return True
219
- else:
220
- if x3 == True:
221
- return True
222
- else:
223
- return True
224
- else:
225
- if x2 == True:
226
- if x3 == True:
227
- return False
228
- else:
229
- return False
230
- else:
231
- if x3 == True:
232
- return False
233
- else:
234
- return False
235
- else:
236
- if c2 == True:
237
- if x0 == True:
238
- if x1 == True:
239
- if x2 == True:
240
- if x3 == True:
241
- return True
242
- else:
243
- return True
244
- else:
245
- if x3 == True:
246
- return False
247
- else:
248
- return False
249
- else:
250
- if x2 == True:
251
- if x3 == True:
252
- return True
253
- else:
254
- return True
255
- else:
256
- if x3 == True:
257
- return False
258
- else:
259
- return False
260
- else:
261
- if x1 == True:
262
- if x2 == True:
263
- if x3 == True:
264
- return True
265
- else:
266
- return True
267
- else:
268
- if x3 == True:
269
- return False
270
- else:
271
- return False
272
- else:
273
- if x2 == True:
274
- if x3 == True:
275
- return True
276
- else:
277
- return True
278
- else:
279
- if x3 == True:
280
- return False
281
- else:
282
- return False
283
- else:
284
- if x0 == True:
285
- if x1 == True:
286
- if x2 == True:
287
- if x3 == True:
288
- return True
289
- else:
290
- return False
291
- else:
292
- if x3 == True:
293
- return True
294
- else:
295
- return False
296
- else:
297
- if x2 == True:
298
- if x3 == True:
299
- return True
300
- else:
301
- return False
302
- else:
303
- if x3 == True:
304
- return True
305
- else:
306
- return False
307
- else:
308
- if x1 == True:
309
- if x2 == True:
310
- if x3 == True:
311
- return True
312
- else:
313
- return False
314
- else:
315
- if x3 == True:
316
- return True
317
- else:
318
- return False
319
- else:
320
- if x2 == True:
321
- if x3 == True:
322
- return True
323
- else:
324
- return False
325
- else:
326
- if x3 == True:
327
- return True
328
- else:
329
- return False