YAC 3.18.0
Yet Another Coupler
Loading...
Searching...
No Matches
test_events.c
Go to the documentation of this file.
1// Copyright (c) 2024 The YAC Authors
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#include <stdlib.h>
6#include <stdio.h>
7#include <string.h>
8#include "tests.h"
9#include "event.h"
10
16int main (void) {
17
18 // basic setup
19 initCalendar(PROLEPTIC_GREGORIAN);
20
21 {
22 struct {
23 enum yac_time_unit_type time_unit;
24 char const * value;
25 } tests[] =
26 {{.time_unit = C_MILLISECOND,
27 .value = "3600000"},
28 {.time_unit = C_SECOND,
29 .value = "3600"},
30 {.time_unit = C_MINUTE,
31 .value = "60"},
32 {.time_unit = C_HOUR,
33 .value = "1"},
34 {.time_unit = C_ISO_FORMAT,
35 .value = "PT01H"}};
36 enum {NUM_TESTS = sizeof(tests) / sizeof(tests[0])};
37 for (size_t i = 0; i < NUM_TESTS; ++i)
38 if (strcmp(
40 tests[i].value, tests[i].time_unit), "PT01H"))
41 PUT_ERR("ERROR in yac_time_to_ISO");
42 }
43
44 {
45 struct event * event = yac_event_new ();
46
47 char const * model_time_step = "5000"; // 5s per time step
48 char const * coupling_time_step = "15000"; // 15s per coupling time step
49
51 int lag = 0;
53
54 // 60s runtime
55 char const * start_date = "1850-01-01T00:00:00";
56 char const * stop_date = "1850-01-01T00:01:00";
57
58 char const * model_time_step_iso =
60 char const * coupling_time_step_iso =
63 event, model_time_step_iso, coupling_time_step_iso,
64 lag, time_operation, start_date, stop_date);
65
66 char time_step_buffer[MAX_TIMEDELTA_STR_LEN];
67 if (strcmp(
68 yac_get_event_coupling_timestep(event, time_step_buffer),
69 coupling_time_step_iso))
70 PUT_ERR("ERROR in yac_get_event_coupling_timestep");
71 if (strcmp(
72 yac_get_event_model_timestep(event, time_step_buffer),
73 model_time_step_iso))
74 PUT_ERR("ERROR in yac_get_event_model_timestep");
76 PUT_ERR("ERROR in yac_get_event_lag");
77
78 free((void*)coupling_time_step_iso);
79 free((void*)model_time_step_iso);
80
81 enum {NUM_TIME_STEPS = 15};
82
83 enum yac_action_type ref_action[NUM_TIME_STEPS] =
89
90 for (int t = 0; t < NUM_TIME_STEPS; ++t) {
91
92 if (yac_event_check(event) != ref_action[t]) PUT_ERR("wrong action\n");
94 }
95
97 }
98
99 {
100 struct event * event = yac_event_new ();
101
102 char const * model_time_step = "5000"; // 5s per time step
103 char const * coupling_time_step = "15000"; // 15s per coupling time step
104
106 int lag = 0;
108
109 // 60s runtime
110 char const * start_date = "1850-01-01T00:00:00";
111 char const * stop_date = "1850-01-01T00:01:00";
112
113 char const * model_time_step_iso =
115 char const * coupling_time_step_iso =
118 event, model_time_step_iso, coupling_time_step_iso,
119 lag, time_operation, start_date, stop_date);
120
121 char time_step_buffer[MAX_TIMEDELTA_STR_LEN];
122 if (strcmp(
123 yac_get_event_coupling_timestep(event, time_step_buffer),
124 coupling_time_step_iso))
125 PUT_ERR("ERROR in yac_get_event_coupling_timestep");
126 if (strcmp(
127 yac_get_event_model_timestep(event, time_step_buffer),
128 model_time_step_iso))
129 PUT_ERR("ERROR in yac_get_event_model_timestep");
131 PUT_ERR("ERROR in yac_get_event_lag");
132
133 free((void*)coupling_time_step_iso);
134 free((void*)model_time_step_iso);
135
136 enum {NUM_TIME_STEPS = 15};
137
138 enum yac_action_type ref_action[NUM_TIME_STEPS] =
139 {COUPLING, NONE, NONE,
144
145 for (int t = 0; t < NUM_TIME_STEPS; ++t) {
146
147 if (yac_event_check(event) != ref_action[t]) PUT_ERR("wrong action\n");
149 }
150
152 }
153
154 {
155 struct event * event = yac_event_new ();
156
157 char * model_time_step = "PT30M";
158 char * coupling_time_step = "PT60M";
159
161 int lag = 0;
163
164 // 60s runtime
165 char const * start_date = "1850-01-01T00:00:00";
166 char const * stop_date = "1850-01-01T06:00:00";
167
168 char const * model_time_step_iso =
170 char const * coupling_time_step_iso =
173 event, model_time_step_iso, coupling_time_step_iso,
174 lag, time_operation, start_date, stop_date);
175
176 char time_step_buffer[MAX_TIMEDELTA_STR_LEN];
177 if (strcmp(
178 yac_get_event_coupling_timestep(event, time_step_buffer),
179 coupling_time_step_iso))
180 PUT_ERR("ERROR in yac_get_event_coupling_timestep");
181 if (strcmp(
182 yac_get_event_model_timestep(event, time_step_buffer),
183 model_time_step_iso))
184 PUT_ERR("ERROR in yac_get_event_model_timestep");
186 PUT_ERR("ERROR in yac_get_event_lag");
187
188 free((void*)coupling_time_step_iso);
189 free((void*)model_time_step_iso);
190
191 enum {NUM_TIME_STEPS = 16};
192
193 enum yac_action_type ref_action[NUM_TIME_STEPS] =
198
199 for (int t = 0; t < NUM_TIME_STEPS; ++t) {
200
201 if (yac_event_check(event) != ref_action[t]) PUT_ERR("wrong action\n");
203 }
204
206 }
207
208 {
209 char const * model_time_step = "5000"; // 5s per time step
210 char const * coupling_time_step = "15000"; // 15s per coupling time step
211
214
215 // 60s runtime
216 char const * start_date = "1850-01-01T00:00:00";
217 char const * stop_date = "1850-01-01T00:01:00";
218
219 enum {MIN_LAG = -6, MAX_LAG = 3};
220 enum {NUM_LAGS = MAX_LAG - MIN_LAG + 1};
221 enum {NUM_TIME_STEPS = 15};
222
223 enum yac_action_type ref_action[NUM_TIME_STEPS - MIN_LAG] =
231
232 for (int lag = MIN_LAG; lag <= MAX_LAG; ++lag) {
233
234 struct event * event = yac_event_new ();
235
236 char const * model_time_step_iso =
238 char const * coupling_time_step_iso =
241 event, model_time_step_iso, coupling_time_step_iso,
242 lag, time_operation, start_date, stop_date);
243
244 char time_step_buffer[MAX_TIMEDELTA_STR_LEN];
245 if (strcmp(
246 yac_get_event_coupling_timestep(event, time_step_buffer),
247 coupling_time_step_iso))
248 PUT_ERR("ERROR in yac_get_event_coupling_timestep");
249 if (strcmp(
250 yac_get_event_model_timestep(event, time_step_buffer),
251 model_time_step_iso))
252 PUT_ERR("ERROR in yac_get_event_model_timestep");
254 PUT_ERR("ERROR in yac_get_event_lag");
255
256 free((void*)coupling_time_step_iso);
257 free((void*)model_time_step_iso);
258
259 for (int t = lag; t < NUM_TIME_STEPS; ++t) {
260
262 if (action != ref_action[t - MIN_LAG])
263 PUT_ERR("wrong action\n");
265 }
266
268 }
269 }
270
271 freeCalendar();
272
273 return TEST_EXIT_CODE;
274}
275
276
char const * yac_time_to_ISO(char const *time, enum yac_time_unit_type time_unit)
Definition event.c:336
@ COUPLING
yac_reduction_type
@ TIME_NONE
@ TIME_AVERAGE
yac_time_unit_type
@ C_SECOND
@ C_HOUR
@ C_MILLISECOND
@ C_MINUTE
@ C_ISO_FORMAT
char * yac_get_event_model_timestep(struct event *event, char *timedelta_str)
Definition event.c:311
char * yac_get_event_coupling_timestep(struct event *event, char *timedelta_str)
Definition event.c:298
int yac_get_event_lag(struct event *event)
Definition event.c:284
void yac_event_delete(struct event *event)
Definition event.c:265
struct event * yac_event_new()
Definition event.c:36
void yac_event_add(struct event *event, char const *delta_model_time, char const *delta_coupling_time, int lag, enum yac_reduction_type time_operation, const char *startdate, const char *stopdate)
Definition event.c:55
enum yac_action_type yac_event_check(struct event *event)
Definition event.c:182
void yac_event_update(struct event *event)
Definition event.c:170
yac_action_type
Definition event.h:13
@ REDUCTION
Definition event.h:15
@ RESTART
Definition event.h:17
@ OUT_OF_BOUND
Definition event.h:22
@ NONE
Definition event.h:14
struct @23::@24 value
Definition event.c:18
enum yac_time_unit_type time_unit
Definition event.c:26
enum yac_reduction_type time_operation
Definition event.c:24
enum yac_action_type action
Definition event.c:25
struct _timedelta * model_time_step
Definition event.c:20
int lag
Definition event.c:23
struct _timedelta * coupling_time_step
Definition event.c:21
#define NUM_TESTS
#define TEST_EXIT_CODE
Definition tests.h:15
#define PUT_ERR(string)
Definition tests.h:10