Skip to content

Commit

Permalink
Added testing infra using py.test. Catches parse errors already, but …
Browse files Browse the repository at this point in the history
…stl compiling tests fail
  • Loading branch information
diara628 committed Jul 26, 2010
1 parent 10bc847 commit d9078fc
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 18 deletions.
12 changes: 10 additions & 2 deletions involute_gears.scad
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,21 @@
//test_gears ();

// 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.
//test_backlash ();

// 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;

Expand Down
1 change: 1 addition & 0 deletions materials.scad
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ Steel = [0.65, 0.67, 0.72];
Stainless = [0.45, 0.43, 0.5];
Aluminum = [0.77, 0.77, 0.8];
Brass = [0.88, 0.78, 0.5];
Transparent = [1, 1, 1, 0.2];

// Example, uncomment to view
//color_demo();
Expand Down
27 changes: 24 additions & 3 deletions openscad_utils.py
Original file line number Diff line number Diff line change
@@ -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*")
func_re = (r"\bfunction\s+(", r")\s*\(")

def extract_mod_names(fpath, name_re=r"\w+"):
regex = name_re.join(mod_re)
print regex
matcher = re.compile(regex)
return (m.group(1) for m in matcher.finditer(fpath.read()))

def extract_func_names(fpath, name_re=r"\w+"):
regex = name_re.join(func_re)
print regex
matcher = re.compile(regex)
return (m.group(1) for m in matcher.finditer(fpath.read()))

Expand All @@ -28,3 +27,25 @@ def collect_test_modules():
return test_files

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()
15 changes: 10 additions & 5 deletions screw.scad
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@ outside_diameter
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){
rotations = length/pitch;
Expand All @@ -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) {
Expand All @@ -35,8 +40,7 @@ module ball_groove(pitch, length, diameter, ball_radius=10) {
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){
rotations = length/pitch;
Expand All @@ -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 test_ball_screw(){}
46 changes: 38 additions & 8 deletions test_compile.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,44 @@
import py

from openscad_utils import *

def pytest_generate_tests(metafunc):
if "mod_name" in metafunc.funcargnames:
for fpath, mod_names in collect_test_modules().items():
for mod_name in mod_names:
metafunc.addcall(funcargs=dict(mod_name=mod_name, mod_file=fpath))
if "modpath" in metafunc.funcargnames:
if "modname" in metafunc.funcargnames:
for fpath, modnames in collect_test_modules().items():
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')

def test_func(mod_name, mod_file, capfd):
fpath = temppath.join(mod_file.base_name)

call_openscad(path=fpath)
def test_compile(modname, modpath):
tempname = "test_" + modpath.basename + modname
fpath = temppath.join(tempname)
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()


0 comments on commit d9078fc

Please sign in to comment.