/*
 * Copyright (c) 2017-2025, Patrick Pelissier
 * All rights reserved.
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * + Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * + Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/* The goal of this test file is to check that invalid constructs
   are properly rejected, and that it generates a helpfull error
   message in this case. */
#include "m-core.h"

#if !defined(TEST)
# warning Please define TEST variable to select the test to run

#elif TEST == 1

/* Test of the call to no default function */
#define OP (INIT(init))

void f(int x, int y) {
  M_CALL_SWAP(OP, x, y);
}

#elif TEST == 2

#define OP (SWAP(0))

void f(int x, int y) {
  M_CALL_SWAP(OP, x, y);
}
     
#elif TEST == 3

#include "m-array.h"
ARRAY_DEF(array, int, DEFAULT_OPLIST)

#elif TEST == 4

#include "m-list.h"
LIST_DEF(list, int, DEFAULT_OPLIST)

#elif TEST == 5

#include "m-list.h"
LIST_DUAL_PUSH_DEF(list, int, DEFAULT_OPLIST)

#elif TEST == 6

#include "m-deque.h"
DEQUE_DEF(deque, int, DEFAULT_OPLIST)

#elif TEST == 7

#include "m-i-list.h"
typedef struct tmp_str_s {
  ILIST_INTERFACE(tmpstr, struct tmp_str_s);
  int n;
} tmp_str_t;
ILIST_DEF(tmpstr, tmp_str_t, DEFAULT_OPLIST)

#elif TEST == 8

#include "m-string.h"
void f(void)
{
  M_LET(x, M_M_STRING_OPLIST) {
  }
}

#elif TEST == 9

#include "m-string.h"
typedef string_t my_type;
#define M_OPL_my_type() MSTRING_OPLIST
void f(void)
{
  M_LET(x, my_type) {
  }
}

#elif TEST == 10

void f(void)
{
  M_LET(x, () ) {
  }
}

#elif TEST == 11

#include "m-algo.h"
#include "m-array.h"

ARRAY_DEF(array, int)
ALGO_DEF(array, M_M_ARRAY_OPLIST(array))

#elif TEST == 12

#include "m-algo.h"
#include "m-array.h"

ARRAY_DEF(array, int)
ALGO_DEF(array, (OPLIST(array)))

#elif TEST == 13

#include "m-bptree.h"

BPTREE_DEF2(tree, 4, int, M_BASIC_OPLIST, int, DEFAULT_OPLIST)

#elif TEST == 14

#include "m-bptree.h"

BPTREE_DEF2(tree, 4, int, DEFAULT_OPLIST, int, M_BASIC_OPLIST)

#elif TEST == 15

#include "m-bptree.h"

BPTREE_DEF(tree, 4, int, DEFAULT_OPLIST)

#elif TEST == 16

#include "m-bptree.h"

BPTREE_MULTI_DEF2(tree, 4, int, DEFAULT_OPLIST, int, M_BASIC_OPLIST)

#elif TEST == 17

#include "m-bptree.h"

BPTREE_MULTI_DEF(tree, 4, int, DEFAULT_OPLIST)

#elif TEST == 18

#include "m-buffer.h"

BUFFER_DEF(buffer, int, 0, BUFFER_QUEUE, DEFAULT_OPLIST)

#elif TEST == 19

#include "m-buffer.h"

QUEUE_MPMC_DEF(buffer, int, BUFFER_QUEUE, DEFAULT_OPLIST)

#elif TEST == 20

#include "m-buffer.h"

QUEUE_SPSC_DEF(buffer, int, BUFFER_QUEUE, DEFAULT_OPLIST)

#elif TEST == 21

#include "m-array.h"
#include "m-concurrent.h"

ARRAY_DEF(array, int)
CONCURRENT_DEF(lock_array, array_t, M_M_ARRAY_OPLIST(array))

#elif TEST == 22

#include "m-array.h"
#include "m-concurrent.h"

ARRAY_DEF(array, int)
CONCURRENT_RP_DEF(lock_array, array_t, MARRAY_OPLIST(array))

#elif TEST == 23

#include "m-dict.h"

DICT_DEF2(array, int, M_BASIC_OPLIST, int, DEFAULT_OPLIST)

#elif TEST == 24

#include "m-dict.h"

DICT_DEF2(array, int, DEFAULT_OPLIST, int, M_BASIC_OPLIST)

#elif TEST == 25

#include "m-dict.h"

DICT_STOREHASH_DEF2(array, int, DEFAULT_OPLIST, int, M_BASIC_OPLIST)

#elif TEST == 26

#include "m-dict.h"

DICT_STOREHASH_DEF2(array, int, M_BASIC_OPLIST, int, DEFAULT_OPLIST)

#elif TEST == 27

#include "m-dict.h"

DICT_OA_DEF2(array, int, DEFAULT_OPLIST, int, M_BASIC_OPLIST)

#elif TEST == 28

#include "m-dict.h"

DICT_OA_DEF2(array, int, M_BASIC_OPLIST, int, DEFAULT_OPLIST)

#elif TEST == 29

#include "m-dict.h"

DICT_SET_DEF(array, int, DEFAULT_OPLIST)

#elif TEST == 30

#include "m-dict.h"

DICT_OASET_DEF(array, int, DEFAULT_OPLIST)

#elif TEST == 31

#include "m-i-shared.h"

typedef struct tmp_s {
  ISHARED_PTR_INTERFACE(tmpi, struct_tmp_s);
  const char *s;
} tmp_t;

ISHARED_PTR_DEF(tmpi, tmp_t, NOT_AN_OPLIST)

#elif TEST == 32

#include "m-prioqueue.h"

PRIOQUEUE_DEF(prio, int, DEFAULT_OPLIST)

#elif TEST == 33

#include "m-rbtree.h"

RBTREE_DEF(tree, int, M_BASIC_OPLIST() )

#elif TEST == 34

#include "m-shared.h"

SHARED_PTR_DEF(shared, int, M_BASIC_OPLIST2 )

#elif TEST == 35

#include "m-shared.h"

SHARED_RESOURCE_DEF(shared, int, M_BASIC_OPLIST3 )

#elif TEST == 36

#include "m-snapshot.h"

SNAPSHOT_SPSC_DEF(snap, int, M_BASIC_OPLIST2 )

#elif TEST == 37

#include "m-snapshot.h"

SNAPSHOT_SPMC_DEF(snap, int, M_BASIC_OPLIST2 )

#elif TEST == 38

#include "m-snapshot.h"

SNAPSHOT_MPMC_DEF(snap, int, M_BASIC_OPLIST8 )

#elif TEST == 39

#include "m-tuple.h"

TUPLE_DEF2(agregate, (x, int, M_BASIC_OPLIST), (y, float, DEFAULT_OPLIST) )

#elif TEST == 40

#include "m-tuple.h"

TUPLE_DEF2(agregate, (x, int, DEFAULT_OPLIST), (y, float) )

#elif TEST == 41

#include "m-variant.h"

VARIANT_DEF2(agregate, (x, int, M_BASIC_OPLIST), (y, float, DEFAULT_OPLIST) )

#elif TEST == 42

#include "m-variant.h"

VARIANT_DEF2(agregate, (x, int, DEFAULT_OPLIST), (y, float) )

#elif TEST == 43

#include "m-funcobj.h"

FUNC_OBJ_ITF_DEF(itf, int, int)

FUNC_OBJ_INS_DEF(ins, itf, (x), { return x * self->a + self->b; }, (a, int, DEFAULT_OPLIST), (b, int, M_BASIC_OPLIST))

#elif TEST == 44

#include "m-funcobj.h"

FUNC_OBJ_ITF_DEF(itf, int, int)

FUNC_OBJ_INS_DEF(ins, itf, (x), { return x * self->a + self->b; }, (a, int), (b, int, M_BASIC_OPLIST() ))


#else
# warning TEST variable is out of range.
#endif

