Added testing infra using py.test. Catches parse errors already, but stl compiling tests fail

This commit is contained in:
Elmom 2010-07-26 20:56:02 +03:00
parent 10bc847279
commit d9078fcc76
5 changed files with 83 additions and 18 deletions

View file

@ -14,13 +14,21 @@
//test_gears (); //test_gears ();
// Meshing Double Helix: // Meshing Double Helix:
//meshing_double_helix (); //test_meshing_double_helix ();
module test_meshing_double_helix(){
test_meshing_double_helix ();
}
// Demonstrate the backlash option for Spur gears. // Demonstrate the backlash option for Spur gears.
//test_backlash (); //test_backlash ();
// Demonstrate how to make meshing bevel gears. // Demonstrate how to make meshing bevel gears.
bevel_gear_pair (); //test_bevel_gear_pair();
module test_bevel_gear_pair(){
bevel_gear_pair ();
}
pi=3.1415926535897932384626433832795; pi=3.1415926535897932384626433832795;

View file

@ -16,6 +16,7 @@ Steel = [0.65, 0.67, 0.72];
Stainless = [0.45, 0.43, 0.5]; Stainless = [0.45, 0.43, 0.5];
Aluminum = [0.77, 0.77, 0.8]; Aluminum = [0.77, 0.77, 0.8];
Brass = [0.88, 0.78, 0.5]; Brass = [0.88, 0.78, 0.5];
Transparent = [1, 1, 1, 0.2];
// Example, uncomment to view // Example, uncomment to view
//color_demo(); //color_demo();

View file

@ -1,17 +1,16 @@
import py, re import py, re, os, signal, time
from subprocess import Popen, PIPE
mod_re = (r"\bmodule\s+(", r")\s*\(\s*") mod_re = (r"\bmodule\s+(", r")\s*\(\s*")
func_re = (r"\bfunction\s+(", r")\s*\(") func_re = (r"\bfunction\s+(", r")\s*\(")
def extract_mod_names(fpath, name_re=r"\w+"): def extract_mod_names(fpath, name_re=r"\w+"):
regex = name_re.join(mod_re) regex = name_re.join(mod_re)
print regex
matcher = re.compile(regex) matcher = re.compile(regex)
return (m.group(1) for m in matcher.finditer(fpath.read())) return (m.group(1) for m in matcher.finditer(fpath.read()))
def extract_func_names(fpath, name_re=r"\w+"): def extract_func_names(fpath, name_re=r"\w+"):
regex = name_re.join(func_re) regex = name_re.join(func_re)
print regex
matcher = re.compile(regex) matcher = re.compile(regex)
return (m.group(1) for m in matcher.finditer(fpath.read())) return (m.group(1) for m in matcher.finditer(fpath.read()))
@ -28,3 +27,25 @@ def collect_test_modules():
return test_files return test_files
collect_test_modules() collect_test_modules()
def call_openscad(path, stlpath, timeout=20):
try:
proc = Popen(['openscad', '-s', str(stlpath), str(path)],
stdout=PIPE, stderr=PIPE, close_fds=True)
calltime = time.time()
#print calltime
while True:
if proc.poll() is not None:
break
time.sleep(0.1)
#print time.time()
if time.time() > calltime + timeout:
raise Exception("Timeout")
finally:
try:
proc.terminate()
proc.kill()
except OSError:
pass
return (proc.returncode,) + proc.communicate()

View file

@ -11,6 +11,11 @@ outside_diameter
inner_diameter: thickness of the shaft inner_diameter: thickness of the shaft
*/ */
//Uncomment to see examples
//test_auger();
//test_ball_groove();
//test_ball_groove2();
//test_ball_screw();
module helix(pitch, length, slices=500){ module helix(pitch, length, slices=500){
rotations = length/pitch; rotations = length/pitch;
@ -26,7 +31,7 @@ module auger(pitch, length, outside_diameter, inner_diameter) {
} }
} }
translate([300, 0, 0]) auger(100, 300); module test_auger(){translate([300, 0, 0]) auger(100, 300);}
module ball_groove(pitch, length, diameter, ball_radius=10) { module ball_groove(pitch, length, diameter, ball_radius=10) {
@ -35,8 +40,7 @@ module ball_groove(pitch, length, diameter, ball_radius=10) {
circle(r = ball_radius); circle(r = ball_radius);
} }
translate([0, 300, 0]) ball_groove(100, 300, 10); module test_ball_groove(){ translate([0, 300, 0]) ball_groove(100, 300, 10);}
module ball_groove2(pitch, length, diameter, ball_radius, slices=200){ module ball_groove2(pitch, length, diameter, ball_radius, slices=200){
rotations = length/pitch; rotations = length/pitch;
@ -51,9 +55,10 @@ module ball_groove2(pitch, length, diameter, ball_radius, slices=200){
} }
} }
translate([0, 0, 0]) ball_groove2(100, 300, 100, 10); module test_ball_groove2(){translate([0, 0, 0]) ball_groove2(100, 300, 100, 10);}
module ball_screw(pitch, length, bearing_radius=2) { module ball_screw(pitch, length, bearing_radius=2) {
} }
module test_ball_screw(){}

View file

@ -1,14 +1,44 @@
import py
from openscad_utils import * from openscad_utils import *
def pytest_generate_tests(metafunc): def pytest_generate_tests(metafunc):
if "mod_name" in metafunc.funcargnames: if "modpath" in metafunc.funcargnames:
for fpath, mod_names in collect_test_modules().items(): if "modname" in metafunc.funcargnames:
for mod_name in mod_names: for fpath, modnames in collect_test_modules().items():
metafunc.addcall(funcargs=dict(mod_name=mod_name, mod_file=fpath)) for modname in modnames:
metafunc.addcall(funcargs=dict(modname=modname, modpath=fpath))
else:
dirpath = py.path.local("./")
for fpath in dirpath.visit('*.scad'):
metafunc.addcall(funcargs=dict(modpath=fpath))
temppath = py.test.ensuretemp('MCAD') temppath = py.test.ensuretemp('MCAD')
def test_func(mod_name, mod_file, capfd): def test_compile(modname, modpath):
fpath = temppath.join(mod_file.base_name) tempname = "test_" + modpath.basename + modname
fpath = temppath.join(tempname)
call_openscad(path=fpath) stlpath = temppath.join(tempname + ".stl")
f = fpath.open('w')
f.write("""
//generated testfile
include <%s>
%s()
""" % (modpath, modname))
f.flush
output = call_openscad(path=fpath, stlpath=stlpath)
print output
assert output[0] is 0
assert "warning" or "error" not in output[2].strip().lowercase()
assert len(stlpath.readlines()) > 2
def test_compile_default(modpath):
tempname = "test_" + modpath.basename
stlpath = temppath.join(tempname + ".stl")
output = call_openscad(path=modpath, stlpath=stlpath)
print output
assert output[0] is 0
assert "warning" or "error" not in output[2].strip().lowercase()