def test_construction_errors(): ''' Test that the Equations constructor raises errors correctly ''' # parse error assert_raises(EquationError, lambda: Equations('dv/dt = -v / tau volt')) # Only a single string or a list of SingleEquation objects is allowed assert_raises(TypeError, lambda: Equations(None)) assert_raises(TypeError, lambda: Equations(42)) assert_raises(TypeError, lambda: Equations(['dv/dt = -v / tau : volt'])) # duplicate variable names assert_raises(EquationError, lambda: Equations('''dv/dt = -v / tau : volt v = 2 * t/second * volt : volt''')) eqs = [SingleEquation(DIFFERENTIAL_EQUATION, 'v', volt, expr=Expression('-v / tau')), SingleEquation(SUBEXPRESSION, 'v', volt, expr=Expression('2 * t/second * volt')) ] assert_raises(EquationError, lambda: Equations(eqs)) # illegal variable names assert_raises(ValueError, lambda: Equations('ddt/dt = -dt / tau : volt')) assert_raises(ValueError, lambda: Equations('dt/dt = -t / tau : volt')) assert_raises(ValueError, lambda: Equations('dxi/dt = -xi / tau : volt')) assert_raises(ValueError, lambda: Equations('for : volt')) assert_raises((EquationError, ValueError), lambda: Equations('d1a/dt = -1a / tau : volt')) assert_raises(ValueError, lambda: Equations('d_x/dt = -_x / tau : volt')) # xi in a subexpression assert_raises(EquationError, lambda: Equations('''dv/dt = -(v + I) / (5 * ms) : volt I = second**-1*xi**-2*volt : volt''')) # more than one xi assert_raises(EquationError, lambda: Equations('''dv/dt = -v / tau + xi/tau**.5 : volt dx/dt = -x / tau + 2*xi/tau : volt tau : second''')) # using not-allowed flags eqs = Equations('dv/dt = -v / (5 * ms) : volt (flag)') eqs.check_flags({DIFFERENTIAL_EQUATION: ['flag']}) # allow this flag assert_raises(ValueError, lambda: eqs.check_flags({DIFFERENTIAL_EQUATION: []})) assert_raises(ValueError, lambda: eqs.check_flags({})) assert_raises(ValueError, lambda: eqs.check_flags({SUBEXPRESSION: ['flag']})) assert_raises(ValueError, lambda: eqs.check_flags({DIFFERENTIAL_EQUATION: ['otherflag']})) # Circular subexpression assert_raises(ValueError, lambda: Equations('''dv/dt = -(v + w) / (10 * ms) : 1 w = 2 * x : 1 x = 3 * w : 1''')) # Boolean/integer differential equations assert_raises(TypeError, lambda: Equations('dv/dt = -v / (10*ms) : boolean')) assert_raises(TypeError, lambda: Equations('dv/dt = -v / (10*ms) : integer'))
def test_construction_errors(): """ Test that the Equations constructor raises errors correctly """ # parse error with pytest.raises(EquationError): Equations('dv/dt = -v / tau volt') with pytest.raises(EquationError): Equations('dv/dt = -v / tau : volt second') # incorrect unit definition with pytest.raises(EquationError): Equations('dv/dt = -v / tau : mvolt') with pytest.raises(EquationError): Equations('dv/dt = -v / tau : voltage') with pytest.raises(EquationError): Equations('dv/dt = -v / tau : 1.0*volt') # Only a single string or a list of SingleEquation objects is allowed with pytest.raises(TypeError): Equations(None) with pytest.raises(TypeError): Equations(42) with pytest.raises(TypeError): Equations(['dv/dt = -v / tau : volt']) # duplicate variable names with pytest.raises(EquationError): Equations("""dv/dt = -v / tau : volt v = 2 * t/second * volt : volt""") eqs = [ SingleEquation(DIFFERENTIAL_EQUATION, 'v', volt.dim, expr=Expression('-v / tau')), SingleEquation(SUBEXPRESSION, 'v', volt.dim, expr=Expression('2 * t/second * volt')) ] with pytest.raises(EquationError): Equations(eqs) # illegal variable names with pytest.raises(SyntaxError): Equations('ddt/dt = -dt / tau : volt') with pytest.raises(SyntaxError): Equations('dt/dt = -t / tau : volt') with pytest.raises(SyntaxError): Equations('dxi/dt = -xi / tau : volt') with pytest.raises(SyntaxError): Equations('for : volt') with pytest.raises((EquationError, SyntaxError)): Equations('d1a/dt = -1a / tau : volt') with pytest.raises(SyntaxError): Equations('d_x/dt = -_x / tau : volt') # xi in a subexpression with pytest.raises(EquationError): Equations("""dv/dt = -(v + I) / (5 * ms) : volt I = second**-1*xi**-2*volt : volt""") # more than one xi with pytest.raises(EquationError): Equations("""dv/dt = -v / tau + xi/tau**.5 : volt dx/dt = -x / tau + 2*xi/tau : volt tau : second""") # using not-allowed flags eqs = Equations('dv/dt = -v / (5 * ms) : volt (flag)') eqs.check_flags({DIFFERENTIAL_EQUATION: ['flag']}) # allow this flag with pytest.raises(ValueError): eqs.check_flags({DIFFERENTIAL_EQUATION: []}) with pytest.raises(ValueError): eqs.check_flags({}) with pytest.raises(ValueError): eqs.check_flags({SUBEXPRESSION: ['flag']}) with pytest.raises(ValueError): eqs.check_flags({DIFFERENTIAL_EQUATION: ['otherflag']}) eqs = Equations('dv/dt = -v / (5 * ms) : volt (flag1, flag2)') eqs.check_flags({DIFFERENTIAL_EQUATION: ['flag1', 'flag2']}) # allow both flags # Don't allow the two flags in combination with pytest.raises(ValueError): eqs.check_flags({DIFFERENTIAL_EQUATION: ['flag1', 'flag2']}, incompatible_flags=[('flag1', 'flag2')]) eqs = Equations("""dv/dt = -v / (5 * ms) : volt (flag1) dw/dt = -w / (5 * ms) : volt (flag2)""") # They should be allowed when used independently eqs.check_flags({DIFFERENTIAL_EQUATION: ['flag1', 'flag2']}, incompatible_flags=[('flag1', 'flag2')]) # Circular subexpression with pytest.raises(ValueError): Equations("""dv/dt = -(v + w) / (10 * ms) : 1 w = 2 * x : 1 x = 3 * w : 1""") # Boolean/integer differential equations with pytest.raises(TypeError): Equations('dv/dt = -v / (10*ms) : boolean') with pytest.raises(TypeError): Equations('dv/dt = -v / (10*ms) : integer')
def test_construction_errors(): ''' Test that the Equations constructor raises errors correctly ''' # parse error assert_raises(SyntaxError, lambda: Equations('dv/dt = -v / tau volt')) # Only a single string or a list of SingleEquation objects is allowed assert_raises(TypeError, lambda: Equations(None)) assert_raises(TypeError, lambda: Equations(42)) assert_raises(TypeError, lambda: Equations(['dv/dt = -v / tau : volt'])) # duplicate variable names assert_raises(SyntaxError, lambda: Equations('''dv/dt = -v / tau : volt v = 2 * t/second * volt : volt''')) # illegal variable names assert_raises(ValueError, lambda: Equations('ddt/dt = -dt / tau : volt')) assert_raises(ValueError, lambda: Equations('dt/dt = -t / tau : volt')) assert_raises(ValueError, lambda: Equations('dxi/dt = -xi / tau : volt')) assert_raises(ValueError, lambda: Equations('for : volt')) assert_raises((SyntaxError, ValueError), lambda: Equations('d1a/dt = -1a / tau : volt')) assert_raises(ValueError, lambda: Equations('d_x/dt = -_x / tau : volt')) # inconsistent unit for a differential equation assert_raises(DimensionMismatchError, lambda: Equations('dv/dt = -v : volt')) assert_raises(DimensionMismatchError, lambda: Equations('dv/dt = -v / tau: volt', namespace={'tau': 5 * mV})) assert_raises(DimensionMismatchError, lambda: Equations('dv/dt = -(v + I) / (5 * ms): volt', namespace={'I': 3 * second})) # inconsistent unit for a static equation assert_raises(DimensionMismatchError, lambda: Equations('''dv/dt = -v / (5 * ms) : volt I = 2 * v : amp''')) # xi in a static equation assert_raises(SyntaxError, lambda: Equations('''dv/dt = -(v + I) / (5 * ms) : volt I = second**-1*xi**-2*volt : volt''' )) # more than one xi assert_raises(SyntaxError, lambda: Equations('''dv/dt = -v / tau + xi/tau**.5 : volt dx/dt = -x / tau + 2*xi/tau : volt tau : second''')) # using not-allowed flags eqs = Equations('dv/dt = -v / (5 * ms) : volt (flag)') eqs.check_flags({DIFFERENTIAL_EQUATION: ['flag']}) # allow this flag assert_raises(ValueError, lambda: eqs.check_flags({DIFFERENTIAL_EQUATION: []})) assert_raises(ValueError, lambda: eqs.check_flags({})) assert_raises(ValueError, lambda: eqs.check_flags({STATIC_EQUATION: ['flag']})) assert_raises(ValueError, lambda: eqs.check_flags({DIFFERENTIAL_EQUATION: ['otherflag']})) # Circular static equations assert_raises(ValueError, lambda: Equations('''dv/dt = -(v + w) / (10 * ms) : 1 w = 2 * x : 1 x = 3 * w : 1'''))