def test1():

    from ctrl import Controller
    controller = Controller()

    Ts = 0.01
    clock = Clock(period = Ts)
    controller.add_source('clock',clock,['clock'])

    a = -1
    b = 1
    def f(t, x, u, a, b):
        return a * x + b * u

    t0 = 0
    uk = 1
    x0 = np.array([0])
    sys = ODE(f, x0 = x0, t0 = t0, pars = (a,b))

    controller.add_signals('input','output')

    controller.add_filter('condition', 
                          Condition(lambda x: x < 1), 
                          ['clock'], ['is_running'])

    controller.add_filter('ode',TimeVarying(sys),['clock','input'],['output'])

    controller.add_sink('logger',Logger(),['clock','output'])

    print(controller.info('all'))    

    controller.set_filter('ode', reset = True)
    controller.set_source('clock', reset = True)
    controller.set_sink('logger', reset = True)
    controller.set_signal('input',uk)
    controller.run()

    log = controller.read_sink('logger')
    t0 = log[0,0]
    tk = log[-1,0]
    yk = log[-1,1]    
    yyk = uk * (1 - math.exp(a*(tk-t0))) + x0 * math.exp(a*(tk-t0))
    #print(t0, tk, yk, yyk)
    #print(log)
    assert np.abs(yk - np.array([yyk])) < 1e-2

    uk = 0
    x0 = sys.state
    controller.set_source('clock', reset = True)
    controller.set_sink('logger', reset = True)
    controller.set_signal('input',uk)
    controller.run()

    log = controller.read_sink('logger')
    t0 = log[0,0]
    tk = log[-1,0]
    yk = log[-1,1]    
    yyk = uk * (1 - math.exp(a*(tk-t0))) + x0 * math.exp(a*(tk-t0))
    #print(t0, tk, yk, yyk)
    #print(log)
    assert np.abs(yk - np.array([yyk])) < 1e-2

    uk = -1
    x0 = sys.state
    controller.set_source('clock', reset = True)
    controller.set_sink('logger', reset = True)
    controller.set_signal('input',uk)
    controller.run()

    log = controller.read_sink('logger')
    t0 = log[0,0]
    tk = log[-1,0]
    yk = log[-1,1]    
    yyk = uk * (1 - math.exp(a*(tk-t0))) + x0 * math.exp(a*(tk-t0))
    #print(t0, tk, yk, yyk)
    assert np.abs(yk - np.array([yyk])) < 1e-2

    clock.set_enabled(False)