From c21b3bd22ae5391efa93253805dd2d64b6b52145 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Charybdis=29?=
 <stepan@adjemian.eu>
Date: Thu, 13 May 2021 16:07:32 +0200
Subject: [PATCH] Fix concatenation with empty dates objects.

Concatenation was failing if the empty object had no frequency set.

Closes #46
---
 src/@dates/horzcat.m | 198 +++++++++++++++++++++++++------------------
 1 file changed, 117 insertions(+), 81 deletions(-)

diff --git a/src/@dates/horzcat.m b/src/@dates/horzcat.m
index a6b6333..4b42a48 100644
--- a/src/@dates/horzcat.m
+++ b/src/@dates/horzcat.m
@@ -30,7 +30,11 @@ end
 o = copy(varargin{1});
 for i=2:nargin
     p = varargin{i};
-    if isequal(o.freq, p.freq)
+    if isequal(o.freq, p.freq) || isempty(o.freq) || isempty(p.freq)
+        if isempty(o)
+            o = copy(p);
+            continue
+        end
         if ~isempty(p)
             o.time = [o.time; p.time];
         end
@@ -39,94 +43,126 @@ for i=2:nargin
     end
 end
 
+return
+
 %@test:1
-%$ % Define some dates
-%$ B1 = '1953Q4';
-%$ B2 = '1950Q2';
-%$ B3 = '1950Q1';
-%$ B4 = '1945Q3';
-%$ B5 = '2009Q2';
-%$
-%$ % Define expected results.
-%$ e.time = [1945*4+3; 1950*4+1; 1950*4+2; 1953*4+4; 2009*4+2];
-%$ e.freq = 4;
-%$
-%$ % Call the tested routine.
-%$ d = dates(B4,B3,B2,B1);
-%$ d = [d, dates(B5)];
-%$
-%$ % Check the results.
-%$ t(1) = dassert(d.time,e.time);
-%$ t(2) = dassert(d.freq,e.freq);
-%$ t(3) = size(e.time,1)==d.ndat();
-%$ T = all(t);
+% Define some dates
+B1 = '1953Q4';
+B2 = '1950Q2';
+B3 = '1950Q1';
+B4 = '1945Q3';
+B5 = '2009Q2';
+
+% Define expected results.
+e.time = [1945*4+3; 1950*4+1; 1950*4+2; 1953*4+4; 2009*4+2];
+e.freq = 4;
+
+% Call the tested routine.
+d = dates(B4,B3,B2,B1);
+d = [d, dates(B5)];
+
+% Check the results.
+t(1) = dassert(d.time,e.time);
+t(2) = dassert(d.freq,e.freq);
+t(3) = size(e.time,1)==d.ndat();
+T = all(t);
 %@eof:1
 
 %@test:2
-%$ % Define some dates
-%$ B1 = '1953Q4';
-%$ B2 = '1950Q2';
-%$ B3 = '1950Q1';
-%$ B4 = '1945Q3';
-%$ B5 = '2009Q2';
-%$
-%$ % Define expected results.
-%$ e.time = [1945*4+3; 1950*4+1; 1950*4+2; 1953*4+4; 2009*4+2];
-%$ e.freq = 4;
-%$
-%$ % Call the tested routine.
-%$ d = dates(B4,B3,B2);
-%$ d = [d, dates(B1), dates(B5)];
-%$
-%$ % Check the results.
-%$ t(1) = dassert(d.time,e.time);
-%$ t(2) = dassert(d.freq,e.freq);
-%$ t(3) = size(e.time,1)==d.ndat();
-%$ T = all(t);
+% Define some dates
+B1 = '1953Q4';
+B2 = '1950Q2';
+B3 = '1950Q1';
+B4 = '1945Q3';
+B5 = '2009Q2';
+
+% Define expected results.
+e.time = [1945*4+3; 1950*4+1; 1950*4+2; 1953*4+4; 2009*4+2];
+e.freq = 4;
+
+% Call the tested routine.
+d = dates(B4,B3,B2);
+d = [d, dates(B1), dates(B5)];
+
+% Check the results.
+t(1) = dassert(d.time,e.time);
+t(2) = dassert(d.freq,e.freq);
+t(3) = size(e.time,1)==d.ndat();
+T = all(t);
 %@eof:2
 
 %@test:3
-%$ % Define some dates
-%$ B1 = '1953Q4';
-%$ B2 = '1950Q2';
-%$ B3 = '1950Q1';
-%$ B4 = '1945Q3';
-%$ B5 = '2009Q2';
-%$
-%$ % Define expected results.
-%$ e.time = [1945*4+3; 1950*4+1; 1950*4+2; 1953*4+4; 2009*4+2];
-%$ e.freq = 4;
-%$
-%$ % Call the tested routine.
-%$ d = dates(B4,B3,B2);
-%$ d = [d, dates(B1,B5)];
-%$
-%$ % Check the results.
-%$ t(1) = dassert(d.time,e.time);
-%$ t(2) = dassert(d.freq,e.freq);
-%$ t(3) = size(e.time,1)==d.ndat();
-%$ T = all(t);
+% Define some dates
+B1 = '1953Q4';
+B2 = '1950Q2';
+B3 = '1950Q1';
+B4 = '1945Q3';
+B5 = '2009Q2';
+
+% Define expected results.
+e.time = [1945*4+3; 1950*4+1; 1950*4+2; 1953*4+4; 2009*4+2];
+e.freq = 4;
+
+% Call the tested routine.
+d = dates(B4,B3,B2);
+d = [d, dates(B1,B5)];
+
+% Check the results.
+t(1) = dassert(d.time,e.time);
+t(2) = dassert(d.freq,e.freq);
+t(3) = size(e.time,1)==d.ndat();
+T = all(t);
 %@eof:3
 
 %@test:4
-%$ % Define some dates
-%$ B1 = '1953Q4';
-%$ B2 = '1950Q2';
-%$ B3 = '1950Q1';
-%$ B4 = '1945Q3';
-%$ B5 = '2009Q2';
-%$
-%$ % Define expected results.
-%$ e.time = [1945*4+3; 1950*4+1; 1950*4+2; 1953*4+4; 2009*4+2];
-%$ e.freq = 4;
-%$
-%$ % Call the tested routine.
-%$ d = dates(B4,B3,B2);
-%$ d = [d, [dates(B1), dates(B5)]];
-%$
-%$ % Check the results.
-%$ t(1) = dassert(d.time,e.time);
-%$ t(2) = dassert(d.freq,e.freq);
-%$ t(3) = size(e.time,1)==d.ndat();
-%$ T = all(t);
+% Define some dates
+B1 = '1953Q4';
+B2 = '1950Q2';
+B3 = '1950Q1';
+B4 = '1945Q3';
+B5 = '2009Q2';
+
+% Define expected results.
+e.time = [1945*4+3; 1950*4+1; 1950*4+2; 1953*4+4; 2009*4+2];
+e.freq = 4;
+
+% Call the tested routine.
+d = dates(B4,B3,B2);
+d = [d, [dates(B1), dates(B5)]];
+
+% Check the results.
+t(1) = dassert(d.time,e.time);
+t(2) = dassert(d.freq,e.freq);
+t(3) = size(e.time,1)==d.ndat();
+T = all(t);
 %@eof:4
+
+%@test:5
+try
+    e = [dates('1938M11') dates()];
+    t(1) = true;
+catch
+    t(1) = false;
+end
+
+if t(1)
+    t(2) = e==dates('1938M11');
+end
+
+T = all(t);
+%@eof:5
+
+%@test:6
+try
+    e = [dates() dates('1938M11')];
+    t(1) = true;
+catch
+    t(1) = false;
+end
+
+if t(1)
+    t(2) = e==dates('1938M11');
+end
+
+T = all(t);
+%@eof:6
\ No newline at end of file
-- 
GitLab