imrishabh18/corne-keyboard

The code defines and renders two surface-mount chip components with SMT pads, silkscreen outlines, and 3D CAD models (OBJ and STEP) for PCB assembly.

Version
2.0.21
License
unset
Stars
1

scripts/test-copper-audit.py

import json,subprocess,sys,tempfile,unittest
from pathlib import Path

def fixture():
 j=[{'type':'source_net','source_net_id':'gnd','name':'GND','subcircuit_connectivity_map_key':'gnd'}, {'type':'source_trace','source_trace_id':'s','connected_source_port_ids':['s0','s1'],'connected_source_net_ids':['gnd'],'subcircuit_connectivity_map_key':'gnd'}]
 for i,x in enumerate([0,5]):
  j.extend([{'type':'source_component','source_component_id':f'c{i}','name':f'J{i}'},{'type':'source_port','source_port_id':f's{i}','source_component_id':f'c{i}','name':'GND'},{'type':'pcb_port','pcb_port_id':f'p{i}','source_port_id':f's{i}','x':x,'y':0},{'type':'pcb_smtpad','pcb_smtpad_id':f'pad{i}','pcb_port_id':f'p{i}','shape':'rect','width':1,'height':1,'x':x,'y':0,'layer':'bottom'}])
 return j
def pour(id,x0,x1,holes=[]):
 ring=lambda a,b:{'vertices':[{'x':a,'y':-1},{'x':b,'y':-1},{'x':b,'y':1},{'x':a,'y':1}]}
 return {'type':'pcb_copper_pour','pcb_copper_pour_id':id,'source_net_id':'gnd','layer':'bottom','shape':'brep','brep_shape':{'outer_ring':ring(x0,x1),'inner_rings':holes}}
def audit(j):
 with tempfile.TemporaryDirectory() as d:
  p=Path(d);(p/'in.json').write_text(json.dumps(j))
  subprocess.run([sys.executable,str(Path(__file__).with_name('audit-copper.py')),str(p/'in.json'),str(p/'out.json')],capture_output=True,text=True,check=True)
  return json.loads((p/'out.json').read_text())
class AuditTests(unittest.TestCase):
 def test_same_net_name_does_not_join_separate_pours(self):
  self.assertEqual(audit(fixture()+[pour('a',-1,1),pour('b',4,6)])['physical_ground_groups'],2)
 def test_continuous_pour_connects_without_traces(self):
  self.assertEqual(audit(fixture()+[pour('a',-1,6)])['physical_ground_groups'],1)
 def test_pad_inside_pour_hole_stays_isolated(self):
  hole={'vertices':[{'x':-0.7,'y':-0.7},{'x':.7,'y':-.7},{'x':.7,'y':.7},{'x':-.7,'y':.7}]}
  self.assertEqual(audit(fixture()+[pour('a',-1,6,[hole])])['physical_ground_groups'],2)
 def test_wrong_layer_trace_does_not_connect_bottom_pads(self):
  t={'type':'pcb_trace','pcb_trace_id':'t','source_trace_id':'s','route':[{'route_type':'wire','layer':'top','x':x,'y':0,'width':.15} for x in [0,5]]}
  self.assertEqual(audit(fixture()+[t])['physical_ground_groups'],2)
if __name__=='__main__':unittest.main()