feat: Add Acres to Hectares calculator and update the calculator backlog list.
This commit is contained in:
114
verify_batch_1.py
Normal file
114
verify_batch_1.py
Normal file
@@ -0,0 +1,114 @@
|
||||
import urllib.request
|
||||
import re
|
||||
import math
|
||||
import time
|
||||
|
||||
calculators = [
|
||||
{
|
||||
"url": "acres-to-square-feet",
|
||||
"factor": 43560,
|
||||
"method1": "multiply"
|
||||
},
|
||||
{
|
||||
"url": "angstroms-to-nanometers",
|
||||
"factor": 0.1,
|
||||
"method1": "multiply"
|
||||
},
|
||||
{
|
||||
"url": "apothecary-ounces-to-grams",
|
||||
"factor": 31.1034768,
|
||||
"method1": "multiply"
|
||||
},
|
||||
{
|
||||
"url": "astronomical-units-to-light-years",
|
||||
"factor": 0.0000158125074,
|
||||
"method1": "multiply"
|
||||
},
|
||||
{
|
||||
"url": "atmosphere-to-mmhg",
|
||||
"factor": 760,
|
||||
"method1": "multiply"
|
||||
}
|
||||
]
|
||||
|
||||
def extract_values_from_js(html_content):
|
||||
# Added [eE\-\+] support for scientific notation (e.g., 1.5812e-05)
|
||||
match1 = re.search(r'let val2.*?val1\s*([*\/\�-9;x]+)\s*([0-9.eE\-\+]+);', html_content)
|
||||
match2 = re.search(r'let val1.*?val2\s*([*\/\�-9;x]+)\s*([0-9.eE\-\+]+);', html_content)
|
||||
return match1, match2
|
||||
|
||||
def clean_op(op_str):
|
||||
if "*" in op_str or "*" in op_str or "x" in op_str.lower():
|
||||
return "*"
|
||||
elif "/" in op_str or "/" in op_str:
|
||||
return "/"
|
||||
return op_str
|
||||
|
||||
def test_math(val_in, target_factor, op):
|
||||
if op == "*":
|
||||
return val_in * target_factor
|
||||
else:
|
||||
return val_in / target_factor
|
||||
|
||||
all_passed = True
|
||||
|
||||
print("Starting Bidirectional Verification Process...\n")
|
||||
|
||||
for calc in calculators:
|
||||
base_url = f"https://howdoyouconvert.com/calculator/{calc['url']}/?ao_noptimize=1" # Bypass Autoptimize cache
|
||||
print(f"Testing: {base_url}")
|
||||
|
||||
req = urllib.request.Request(base_url, headers={'User-Agent': 'Mozilla/5.0'})
|
||||
try:
|
||||
resp = urllib.request.urlopen(req)
|
||||
html = resp.read().decode('utf-8')
|
||||
except Exception as e:
|
||||
print(" [FAIL] Could not load page:", e)
|
||||
all_passed = False
|
||||
continue
|
||||
|
||||
m1, m2 = extract_values_from_js(html)
|
||||
|
||||
if not m1 or not m2:
|
||||
print(" [FAIL] Could not locate the injected JavaScript formulas.")
|
||||
all_passed = False
|
||||
continue
|
||||
|
||||
op1, factor1 = m1.groups()
|
||||
op2, factor2 = m2.groups()
|
||||
|
||||
op1 = clean_op(op1)
|
||||
op2 = clean_op(op2)
|
||||
|
||||
factor1 = float(factor1)
|
||||
factor2 = float(factor2)
|
||||
|
||||
# 1. Forward Test
|
||||
test_val1 = 10.0
|
||||
expected_v2 = test_math(test_val1, calc["factor"], "*" if calc["method1"] == "multiply" else "/")
|
||||
actual_v2 = test_math(test_val1, factor1, op1)
|
||||
|
||||
if not math.isclose(expected_v2, actual_v2, rel_tol=1e-5):
|
||||
print(f" [FAIL] Forward Test mismatch! Expected {expected_v2}, got {actual_v2}")
|
||||
all_passed = False
|
||||
else:
|
||||
print(f" [PASS] Forward Test: 10 {op1} {factor1} = {actual_v2}")
|
||||
|
||||
# 2. Reverse Test
|
||||
test_val2 = actual_v2
|
||||
expected_v1 = test_val1
|
||||
actual_v1 = test_math(test_val2, factor2, op2)
|
||||
|
||||
if not math.isclose(expected_v1, actual_v1, rel_tol=1e-5):
|
||||
print(f" [FAIL] Reverse Test mismatch! Expected {expected_v1}, got {actual_v1}")
|
||||
all_passed = False
|
||||
else:
|
||||
print(f" [PASS] Reverse Test: {test_val2} {op2} {factor2} = {actual_v1}")
|
||||
|
||||
print("")
|
||||
time.sleep(0.5)
|
||||
|
||||
if all_passed:
|
||||
print("✅ Verification Complete: All 5 calculators passed bidirectional testing accurately.")
|
||||
else:
|
||||
print("❌ Verification Failed: One or more calculators failed math tolerances.")
|
||||
Reference in New Issue
Block a user