changeset 35:1f80673af4c7

Make concat take a list of arbitrary length; test it, and improve test output
author Chris Cannam
date Sat, 22 Dec 2012 10:08:06 +0000
parents d36c679577a1
children fa49869bda51
files block.yeti framer.yeti fvector.yeti test/all.yeti test/test.yeti test/test_fvector.yeti
diffstat 6 files changed, 46 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/block.yeti	Fri Dec 21 22:56:45 2012 +0000
+++ b/block.yeti	Sat Dec 22 10:08:06 2012 +0000
@@ -29,8 +29,8 @@
 resizedTo n b =
     Block (vec.resizedTo n (unblock b));
 
-concat b1 b2 =
-    Block (vec.concat (unblock b1) (unblock b2));
+concat blocks =
+    Block (vec.concat (map unblock blocks));
 
 {
 zeros, ones,
--- a/framer.yeti	Fri Dec 21 22:56:45 2012 +0000
+++ b/framer.yeti	Sat Dec 22 10:08:06 2012 +0000
@@ -28,8 +28,8 @@
     // Retain framesize - hop samples from old buffer, add hop samples
     // (zero-padded if necessary) just read
     buffer = vec.concat
-       (vec.rangeOf buffer hop (size-hop))
-       (vec.resizedTo hop samples);
+       [vec.rangeOf buffer hop (size-hop),
+        vec.resizedTo hop samples];
 
     // Number of "valid" elements (not tail-end zero-padding) left in buffer
     remaining = valid - (hop - obtained);
--- a/fvector.yeti	Fri Dec 21 22:56:45 2012 +0000
+++ b/fvector.yeti	Sat Dec 22 10:08:06 2012 +0000
@@ -39,12 +39,16 @@
 resizedTo n v is number -> ~double[] -> ~double[] =
     Arrays#copyOf(v, n);
 
-concat v1 v2 is ~double[] -> ~double[] -> ~double[] =
-   (v1len = length' v1;
-    v2len = length' v2;
-    v = resizedTo (v1len + v2len) v1;
-    for [0..v2len-1] do i: v[v1len + i] := v2[i] done;
-    v);
+concat vv is list?<~double[]> -> ~double[] =
+   (len = sum (map length' vv);
+    vout = zeros len;
+    var base = 0;
+    for vv do v: 
+        vlen = length' v;
+        for [0..vlen-1] do i: vout[base + i] := v[i] done;
+        base := base + vlen;
+    done;
+    vout);
 
 {
 zeros, ones,
--- a/test/all.yeti	Fri Dec 21 22:56:45 2012 +0000
+++ b/test/all.yeti	Sat Dec 22 10:08:06 2012 +0000
@@ -6,8 +6,19 @@
 vec = load test.test_fvector;
 bf = load test.test_blockfuncs;
 
-test.runTests "fvector" vec.tests;
-test.runTests "framer" fr.tests;
-test.runTests "blockfuncs" bf.tests;
+tests = [
+"fvector": vec.tests,
+"framer": fr.tests,
+"blockfuncs": bf.tests,
+];
 
+bad = sum (mapHash do name tests: test.runTests name tests done tests);
 
+if (bad > 0) then
+    println "\n** \(bad) test(s) failed!";
+else
+    ()
+fi
+
+
+
--- a/test/test.yeti	Fri Dec 21 22:56:45 2012 +0000
+++ b/test/test.yeti	Sat Dec 22 10:08:06 2012 +0000
@@ -27,10 +27,13 @@
         
 runTests group testHash =
    (failed = failedTests testHash;
-    println "\(group): \(length testHash - length failed)/\(length testHash) tests passed";
+    good = (length testHash - length failed);
+    bad = length failed;
+    println "\(group): \(good)/\(good+bad) tests passed";
     if not empty? failed then
-        println "\(group): Failed tests [\(length failed)]: \(strJoin ' ' failed)";
-    fi);
+        println "\(group): Failed tests [\(bad)]: \(strJoin ' ' failed)";
+    fi;
+    bad);
 
 declare tests is hash<string, () -> boolean> -> 'a =
     { tests };
--- a/test/test_fvector.yeti	Fri Dec 21 22:56:45 2012 +0000
+++ b/test/test_fvector.yeti	Sat Dec 22 10:08:06 2012 +0000
@@ -85,17 +85,25 @@
         vec.equal (vec.resizedTo 2 (vec.vector [1,2,3])) (vec.vector [1,2]);
 ),
 
-"concat": \(
+"concat2": \(
     v = vec.vector [1,2,3];
     w = vec.vector [4,5,6];
-    x = vec.concat v w;
+    x = vec.concat [v, w];
     x' = vec.vector [1,2,3,4,5,6];
     vec.equal x x' and
        (v[0] := 0; // check result is not aliasing inputs
         w[0] := 0;
         vec.equal x x') and
-        vec.equal x' (vec.concat x' (vec.vector [])) and
-        vec.equal x' (vec.concat (vec.vector []) x')
+        vec.equal x' (vec.concat [x', vec.vector []]) and
+        vec.equal x' (vec.concat [vec.vector [], x'])
+),
+
+"concatn": \(
+    v = vec.vector [1,2,3];
+    w = vec.vector [4,5,6];
+    vec.equal (vec.concat []) (vec.zeros 0) and
+        vec.equal (vec.concat [v]) v and
+        vec.equal (vec.concat [v,w,v]) (vec.vector [1,2,3,4,5,6,1,2,3])
 ),
 
 ];