blob: 5d55912cda2eabb2c1b7c4820954b7dffb28343b [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 "charmony.h"
#define CFC_USE_TEST_MACROS
#include "CFCBase.h"
#include "CFCClass.h"
#include "CFCFile.h"
#include "CFCFileSpec.h"
#include "CFCParcel.h"
#include "CFCParser.h"
#include "CFCTest.h"
#include "CFCType.h"
#include "CFCUtil.h"
#include "CFCVariable.h"
static void
S_run_tests(CFCTest *test);
const CFCTestBatch CFCTEST_BATCH_FILE = {
"Clownfish::CFC::Model::File",
20,
S_run_tests
};
static void
S_run_tests(CFCTest *test) {
#define STUFF_THING "Stuff" CHY_DIR_SEP "Thing"
CFCParser *parser = CFCParser_new();
CFCFileSpec *file_spec = CFCFileSpec_new(".", STUFF_THING, ".cfh", 0);
{
const char *string =
"parcel Stuff;\n"
"class Stuff::Thing {\n"
" Foo *foo;\n"
" Bar *bar;\n"
"}\n"
"class Foo {}\n"
"class Bar {}\n"
"__C__\n"
"int foo;\n"
"__END_C__\n";
CFCFile *file = CFCParser_parse_file(parser, string, file_spec);
STR_EQ(test, CFCFile_get_path(file),
"." CHY_DIR_SEP STUFF_THING ".cfh", "get_path");
STR_EQ(test, CFCFile_get_source_dir(file), ".", "get_source_dir");
STR_EQ(test, CFCFile_get_path_part(file), STUFF_THING,
"get_path_part");
OK(test, !CFCFile_included(file), "included");
STR_EQ(test, CFCFile_guard_name(file), "H_STUFF_THING", "guard_name");
STR_EQ(test, CFCFile_guard_start(file),
"#ifndef H_STUFF_THING\n#define H_STUFF_THING 1\n",
"guard_start");
STR_EQ(test, CFCFile_guard_close(file), "#endif /* H_STUFF_THING */\n",
"guard_close");
OK(test, !CFCFile_get_modified(file), "modified false at start");
CFCFile_set_modified(file, 1);
OK(test, CFCFile_get_modified(file), "set_modified, get_modified");
#define PATH_TO_STUFF_THING \
"path" CHY_DIR_SEP \
"to" CHY_DIR_SEP \
"Stuff" CHY_DIR_SEP \
"Thing"
char *c_path = CFCFile_c_path(file, "path/to");
STR_EQ(test, c_path, PATH_TO_STUFF_THING ".c", "c_path");
FREEMEM(c_path);
char *h_path = CFCFile_h_path(file, "path/to");
STR_EQ(test, h_path, PATH_TO_STUFF_THING ".h", "h_path");
FREEMEM(h_path);
CFCClass **classes = CFCFile_classes(file);
OK(test,
classes[0] != NULL && classes[1] != NULL && classes[2] != NULL
&& classes[3] == NULL,
"classes() filters blocks");
CFCVariable **member_vars = CFCClass_fresh_member_vars(classes[0]);
CFCType *foo_type = CFCVariable_get_type(member_vars[0]);
CFCType_resolve(foo_type);
STR_EQ(test, CFCType_get_specifier(foo_type), "stuff_Foo",
"file production picked up parcel def");
CFCType *bar_type = CFCVariable_get_type(member_vars[1]);
CFCType_resolve(bar_type);
STR_EQ(test, CFCType_get_specifier(bar_type), "stuff_Bar",
"parcel def is sticky");
CFCParcel *parcel = CFCFile_get_parcel(file);
STR_EQ(test, CFCParcel_get_name(parcel), "Stuff", "get_parcel");
CFCBase **blocks = CFCFile_blocks(file);
STR_EQ(test, CFCBase_get_cfc_class(blocks[0]),
"Clownfish::CFC::Model::Class", "blocks[0]");
STR_EQ(test, CFCBase_get_cfc_class(blocks[1]),
"Clownfish::CFC::Model::Class", "blocks[1]");
STR_EQ(test, CFCBase_get_cfc_class(blocks[2]),
"Clownfish::CFC::Model::Class", "blocks[2]");
STR_EQ(test, CFCBase_get_cfc_class(blocks[3]),
"Clownfish::CFC::Model::CBlock", "blocks[3]");
OK(test, blocks[4] == NULL, "blocks[4]");
CFCBase_decref((CFCBase*)file);
CFCClass_clear_registry();
}
CFCBase_decref((CFCBase*)file_spec);
CFCBase_decref((CFCBase*)parser);
CFCParcel_reap_singletons();
}