Mercurial > hg > ltpda
diff m-toolbox/test/test_ao_rotate.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/test/test_ao_rotate.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,138 @@ +function test_ao_rotate() + % test the rotate method + + % assume that the math is done right and test only the method interface + + % construct input AOs + v1 = ao(1); + v2 = ao(1); + + % two AOs - no rotation + v = rotate(v1, v2); + v1r = index(v, 1); + v2r = index(v, 2); + assert(abs(v1r.y - 1) < 1e-15); + assert(abs(v2r.y - 1) < 1e-15); + + % two AOs and a scalar + v = rotate(v1, v2, pi); + v1r = index(v, 1); + v2r = index(v, 2); + assert(abs(v1r.y - -1) < 1e-15); + assert(abs(v2r.y - -1) < 1e-15); + + % three AOs + v = rotate(v1, v2, ao(pi)); + v1r = index(v, 1); + v2r = index(v, 2); + assert(abs(v1r.y - -1) < 1e-15); + assert(abs(v2r.y - -1) < 1e-15); + + % two AOs and a plist + v = rotate(v1, v2, plist('ang', pi)); + v1r = index(v, 1); + v2r = index(v, 2); + assert(abs(v1r.y - -1) < 1e-15); + assert(abs(v2r.y - -1) < 1e-15); + + % two AOs and a plist with an AO + v = rotate(v1, v2, plist('ang', ao(pi))); + v1r = index(v, 1); + v2r = index(v, 2); + assert(abs(v1r.y - -1) < 1e-15); + assert(abs(v2r.y - -1) < 1e-15); + + % check that original vectors didn't change + assert(v1.y == 1); + assert(v2.y == 1); + + % invalid call as modifier + try + rotate(v1, v2, plist('ang', ao(pi))); + assert(false, 'this call should fail'); + catch e + assert(strncmp(e.message, '### ao/rotate can not be used as a modifier method. Please give at least one output', ... + length('### ao/rotate can not be used as a modifier method. Please give at least one output'))); + end + + % invalid call with one AO + try + v = rotate(v1, plist('ang', ao(pi))); %#ok<NASGU,ASGLU> + assert(false, 'this call should fail'); + catch e + assert(strncmp(e.message, '### wrong number of input AOs', length('### wrong number of input AOs'))); + end + + % invalid call with four AOs + try + v = rotate(v1, v2, v1, v2); %#ok<NASGU,ASGLU> + assert(false, 'this call should fail'); + catch e + assert(strncmp(e.message, '### wrong number of input AOs', length('### wrong number of input AOs'))); + end + + % test with vectors + v1 = ao(ones(100, 1)); + v2 = ao(ones(100, 1)); + + % two AOs and a scalar + v = rotate(v1, v2, pi); + v1r = index(v, 1); + v2r = index(v, 2); + assert(all(abs(v1r.y - -1) < 1e-15)); + assert(all(abs(v2r.y - -1) < 1e-15)); + + % invalid call with two AOs and a scalar as a modifier + try + rotate(v1, v2, pi); + assert(false, 'this call should fail'); + catch e + assert(strncmp(e.message, '### ao/rotate can not be used as a modifier method. Please give at least one output', ... + length('### ao/rotate can not be used as a modifier method. Please give at least one output'))); + end + + % test with sine waves and different rotation angle + v1 = ao(plist('waveform', 'sine', 'fs', 10, 'nsecs', 100, 'f', 0.01)); + v2 = ao(plist('tsfcn', 'zeros(size(t))', 'fs', 10, 'nsecs', 100)); + % iplot(v1, v2); + + % rotate by 45 degrees + v = rotate(v1, v2, 0.25*pi); + v1r = index(v, 1); + v2r = index(v, 2); + % iplot(v1r, v2r); + assert(almostEqual(v1r, v1/sqrt(2))); + assert(almostEqual(v2r, v1/sqrt(2))); + + % rotate by 90 degrees + v = rotate(v1, v2, 0.5*pi); + v1r = index(v, 1); + v2r = index(v, 2); + % iplot(v1r, v2r); + assert(almostEqual(v1r, v2)); + assert(almostEqual(v2r, v1)); + + % rotate by 180 degrees + v = rotate(v1, v2, pi); + v1r = index(v, 1); + v2r = index(v, 2); + % iplot(v1r, v2r); + assert(almostEqual(v1r, -v1)); + assert(almostEqual(v2r, v2)); + + % rotate by -45 degrees + v = rotate(v1, v2, -0.25*pi); + v1r = index(v, 1); + v2r = index(v, 2); + % iplot(v1r, v2r); + assert(almostEqual(v1r, v1/sqrt(2))); + assert(almostEqual(v2r, -v1/sqrt(2))); + +end + +function rv = almostEqual(x, y, t) + if nargin == 2 + t = 1e-15; + end + rv = all(abs(x.y - y.y) < t); +end