blob: 530618223f61a90e4b3db0792a21608a8d9a74e4 [file] [log] [blame]
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <string.h>
#include "charmony.h"
#define CFC_USE_TEST_MACROS
#include "CFCBase.h"
#include "CFCFileSpec.h"
#include "CFCParcel.h"
#include "CFCSymbol.h"
#include "CFCUtil.h"
#include "CFCVersion.h"
#include "CFCTest.h"
#ifndef true
#define true 1
#define false 0
#endif
static void
S_run_tests(CFCTest *test);
static void
S_run_prereq_tests(CFCTest *test);
static void
S_run_basic_tests(CFCTest *test);
static void
S_run_extended_tests(CFCTest *test);
const CFCTestBatch CFCTEST_BATCH_PARCEL = {
"Clownfish::CFC::Model::Parcel",
41,
S_run_tests
};
static void
S_run_tests(CFCTest *test) {
S_run_prereq_tests(test);
S_run_basic_tests(test);
S_run_extended_tests(test);
}
static void
S_run_prereq_tests(CFCTest *test) {
{
CFCVersion *v77_66_55 = CFCVersion_new("v77.66.55");
CFCPrereq *prereq = CFCPrereq_new("Flour", v77_66_55);
const char *name = CFCPrereq_get_name(prereq);
STR_EQ(test, name, "Flour", "prereq get_name");
CFCVersion *version = CFCPrereq_get_version(prereq);
INT_EQ(test, CFCVersion_compare_to(version, v77_66_55), 0,
"prereq get_version");
CFCBase_decref((CFCBase*)prereq);
CFCBase_decref((CFCBase*)v77_66_55);
}
{
CFCVersion *v0 = CFCVersion_new("v0");
CFCPrereq *prereq = CFCPrereq_new("Sugar", NULL);
CFCVersion *version = CFCPrereq_get_version(prereq);
INT_EQ(test, CFCVersion_compare_to(version, v0), 0,
"prereq with default version");
CFCBase_decref((CFCBase*)prereq);
CFCBase_decref((CFCBase*)v0);
}
}
static void
S_run_basic_tests(CFCTest *test) {
CFCVersion *version = CFCVersion_new("v32.10.102");
CFCVersion *major = CFCVersion_new("v32.0.0");
CFCParcel *foo = CFCParcel_new("Foo", "FooNick", version, major, NULL);
OK(test, foo != NULL, "new");
STR_EQ(test, CFCParcel_get_name(foo), "Foo", "get_name");
STR_EQ(test, CFCParcel_get_nickname(foo), "FooNick", "get_nickname");
STR_EQ(test, CFCVersion_get_vstring(CFCParcel_get_version(foo)),
"v32.10.102", "get_version");
STR_EQ(test, CFCVersion_get_vstring(CFCParcel_get_major_version(foo)),
"v32.0.0", "get_major_version");
OK(test, !CFCParcel_included(foo), "not included");
OK(test, !CFCParcel_is_installed(foo), "not installed");
CFCParcel_register(foo);
{
CFCParcel *same_name = CFCParcel_new("Foo", NULL, NULL, NULL, NULL);
char *error;
CFCUTIL_TRY {
CFCParcel_register(same_name);
}
CFCUTIL_CATCH(error);
OK(test, error && strstr(error, "already registered"),
"can't register two parcels with the same name");
FREEMEM(error);
CFCBase_decref((CFCBase*)same_name);
}
{
CFCParcel *same_nick
= CFCParcel_new("OtherFoo", "FooNick", NULL, NULL, NULL);
char *error;
CFCUTIL_TRY {
CFCParcel_register(same_nick);
}
CFCUTIL_CATCH(error);
OK(test, error && strstr(error, "already registered"),
"can't register two parcels with the same nickname");
FREEMEM(error);
CFCBase_decref((CFCBase*)same_nick);
}
CFCFileSpec *file_spec = CFCFileSpec_new(".", "Parcel", ".cfp", true);
CFCParcel *included_foo
= CFCParcel_new("IncludedFoo", NULL, NULL, NULL, file_spec);
OK(test, CFCParcel_included(included_foo), "included");
STR_EQ(test, CFCParcel_get_cfp_path(included_foo),
"." CHY_DIR_SEP "Parcel.cfp", "get_cfp_path");
STR_EQ(test, CFCVersion_get_vstring(CFCParcel_get_version(included_foo)),
"v0", "version defaults to v0");
STR_EQ(test,
CFCVersion_get_vstring(CFCParcel_get_major_version(included_foo)),
"v0", "major_version defaults to v0");
CFCParcel_register(included_foo);
{
CFCParcel **all_parcels = CFCParcel_all_parcels();
OK(test, all_parcels[0] && all_parcels[1] && !all_parcels[2],
"all_parcels returns two parcels");
STR_EQ(test, CFCParcel_get_name(all_parcels[0]), "Foo",
"all_parcels returns parcel Foo");
STR_EQ(test, CFCParcel_get_name(all_parcels[1]), "IncludedFoo",
"all_parcels returns parcel IncludedFoo");
}
{
CFCParcel_add_inherited_parcel(foo, included_foo);
CFCParcel **inh_parcels = CFCParcel_inherited_parcels(foo);
OK(test, inh_parcels[0] && !inh_parcels[1],
"inherited_parcels returns one parcel");
STR_EQ(test, CFCParcel_get_name(inh_parcels[0]), "IncludedFoo",
"inh_parcels returns parcel IncludedFoo");
FREEMEM(inh_parcels);
}
CFCBase_decref((CFCBase*)included_foo);
CFCBase_decref((CFCBase*)file_spec);
CFCBase_decref((CFCBase*)foo);
CFCBase_decref((CFCBase*)major);
CFCBase_decref((CFCBase*)version);
CFCParcel_reap_singletons();
}
static void
S_run_extended_tests(CFCTest *test) {
{
const char *json =
" {\n"
" \"name\": \"Crustacean\",\n"
" \"nickname\": \"Crust\",\n"
" \"version\": \"v0.1.0\"\n"
" }\n";
CFCParcel *parcel = CFCParcel_new_from_json(json, NULL);
OK(test, parcel != NULL, "new_from_json");
CFCBase_decref((CFCBase*)parcel);
}
{
char *dir = CFCTest_path("cfbase");
CFCFileSpec *file_spec = CFCFileSpec_new(dir, "Animal", ".cfp", false);
CFCParcel *parcel = CFCParcel_new_from_file(file_spec);
OK(test, parcel != NULL, "new_from_file");
CFCBase_decref((CFCBase*)parcel);
CFCBase_decref((CFCBase*)file_spec);
FREEMEM(dir);
}
{
CFCParcel *parcel = CFCParcel_new("Crustacean", "Crust", NULL, NULL,
NULL);
CFCParcel_register(parcel);
STR_EQ(test, CFCVersion_get_vstring(CFCParcel_get_version(parcel)),
"v0", "get_version");
CFCBase_decref((CFCBase*)parcel);
CFCParcel_reap_singletons();
}
{
const char *json =
" {\n"
" \"name\": \"Crustacean\",\n"
" \"version\": \"v0.1.0\",\n"
" \"prerequisites\": {\n"
" \"Clownfish\": null,\n"
" \"Arthropod\": \"v30.104.5\"\n"
" }\n"
" }\n";
CFCParcel *parcel = CFCParcel_new_from_json(json, NULL);
CFCPrereq **prereqs = CFCParcel_get_prereqs(parcel);
OK(test, prereqs != NULL, "prereqs");
CFCPrereq *cfish = prereqs[0];
OK(test, cfish != NULL, "prereqs[0]");
const char *cfish_name = CFCPrereq_get_name(cfish);
STR_EQ(test, cfish_name, "Clownfish", "prereqs[0] name");
CFCVersion *v0 = CFCVersion_new("v0");
CFCVersion *cfish_version = CFCPrereq_get_version(cfish);
INT_EQ(test, CFCVersion_compare_to(cfish_version, v0), 0,
"prereqs[0] version");
CFCPrereq *apod = prereqs[1];
OK(test, apod != NULL, "prereqs[1]");
const char *apod_name = CFCPrereq_get_name(apod);
STR_EQ(test, apod_name, "Arthropod", "prereqs[1] name");
CFCVersion *v30_104_5 = CFCVersion_new("v30.104.5");
CFCVersion *apod_version = CFCPrereq_get_version(apod);
INT_EQ(test, CFCVersion_compare_to(apod_version, v30_104_5), 0,
"prereqs[1] version");
OK(test, prereqs[2] == NULL, "prereqs[2]");
CFCBase_decref((CFCBase*)v30_104_5);
CFCBase_decref((CFCBase*)v0);
CFCBase_decref((CFCBase*)parcel);
}
{
CFCFileSpec *foo_file_spec = CFCFileSpec_new(".", "Foo", ".cfp", true);
CFCParcel *foo = CFCParcel_new("Foo", NULL, NULL, NULL, foo_file_spec);
CFCParcel_register(foo);
CFCVersion *cfish_version = CFCVersion_new("v0.8.7");
CFCFileSpec *cfish_file_spec
= CFCFileSpec_new(".", "Clownfish", ".cfp", true);
CFCParcel *cfish = CFCParcel_new("Clownfish", NULL, cfish_version,
NULL, cfish_file_spec);
CFCParcel_register(cfish);
const char *crust_json =
" {\n"
" \"name\": \"Crustacean\",\n"
" \"version\": \"v0.1.0\",\n"
" \"prerequisites\": {\n"
" \"Clownfish\": \"v0.8.5\",\n"
" }\n"
" }\n";
CFCParcel *crust = CFCParcel_new_from_json(crust_json, NULL);
CFCParcel_register(crust);
CFCParcel **prereq_parcels = CFCParcel_prereq_parcels(crust);
OK(test, prereq_parcels[0] != NULL, "prereq_parcels[0]");
const char *name = CFCParcel_get_name(prereq_parcels[0]);
STR_EQ(test, name, "Clownfish", "prereq_parcels[0] name");
OK(test, prereq_parcels[1] == NULL, "prereq_parcels[0]");
OK(test, CFCParcel_has_prereq(crust, cfish), "has_prereq");
OK(test, CFCParcel_has_prereq(crust, crust), "has_prereq self");
OK(test, !CFCParcel_has_prereq(crust, foo), "has_prereq false");
CFCParcel_add_struct_sym(cfish, "Swim");
CFCParcel_add_struct_sym(crust, "Pinch");
CFCParcel_add_struct_sym(foo, "Bar");
CFCParcel *found;
found = CFCParcel_lookup_struct_sym(crust, "Swim");
OK(test, found == cfish, "lookup_struct_sym prereq");
found = CFCParcel_lookup_struct_sym(crust, "Pinch");
OK(test, found == crust, "lookup_struct_sym self");
found = CFCParcel_lookup_struct_sym(crust, "Bar");
OK(test, found == NULL, "lookup_struct_sym other");
FREEMEM(prereq_parcels);
CFCBase_decref((CFCBase*)crust);
CFCBase_decref((CFCBase*)cfish_version);
CFCBase_decref((CFCBase*)cfish_file_spec);
CFCBase_decref((CFCBase*)cfish);
CFCBase_decref((CFCBase*)foo_file_spec);
CFCBase_decref((CFCBase*)foo);
CFCParcel_reap_singletons();
}
}