test_that("redland library loads", {
    library(redland)
    # Add a line to this test to prevent 'Empty test' (skipped) msg.
    expect_true(require(redland))
})
test_that("librdf basic functions", {
    library(redland)
    world <- librdf_new_world();
    expect_match(class(world), "_p_librdf_world_s")
    storage <- librdf_new_storage(world,'hashes','dummy',"new=yes,hash-type='memory'")
    expect_match(class(storage), "_p_librdf_storage_s")

    model <- librdf_new_model(world,storage,'')
    expect_match(class(model), "_p_librdf_model_s")

    parser <- librdf_new_parser(world,'rdfxml','application/rdf+xml',NULL)
    expect_match(class(parser), "_p_librdf_parser_s")
    uri <- librdf_new_uri(world,paste0('file:',system.file('extdata/dc.rdf', package='redland')))
    expect_match(class(uri), "_p_librdf_uri_s")
    rv <- librdf_parser_parse_into_model(parser,uri,uri,model)
    expect_equal(rv, 0)
    librdf_free_uri(uri);
    librdf_free_parser(parser);

    query <- librdf_new_query(world, 'sparql', NULL, "PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT ?a ?c ?d WHERE { ?a dc:title ?c . OPTIONAL { ?a dc:related ?d } }", NULL)
    results <- librdf_model_query_execute(model, query);
    expect_false(is.null(results))
    expect_match(class(results), "_p_librdf_query_results")

    # Convert the whole sparql result to a string and check its value
    qstr <- librdf_query_results_to_string2(results, "rdfxml", "application/rdf+xml", NULL, NULL)
    expect_match(qstr, "http://www.dajobe.org/")
    expect_match(qstr, "Beckett")

    # Test adding a new Statement to the model
    about <- "http://matt.magisa.org/"
    subject <- librdf_new_node_from_uri_string(world, about)
    expect_false(is.null(subject))
    expect_match(class(subject), "_p_librdf_node_s")
    pred <- librdf_new_node_from_uri_string(world, "http://purl.org/dc/elements/1.1/title")
    expect_false(is.null(pred))
    expect_match(class(pred), "_p_librdf_node_s")
    object <- librdf_new_node_from_literal(world, "Matt Jones' Home Page", "", 0)
    expect_false(is.null(object))
    expect_match(class(object), "_p_librdf_node_s")
    statement <- librdf_new_statement_from_nodes(world, subject, pred, object)
    expect_false(is.null(statement))
    expect_match(class(statement), "_p_librdf_statement_s")

    rc <- librdf_model_add_statement(model, statement)
    expect_equal(rc, 0)

    # Don't need to call librdf_free_node, just librdf_free_statement.
    librdf_free_statement(statement)

    # Test serialization of the model to a text file
    serializer <- librdf_new_serializer(world, "rdfxml", "", NULL);
    expect_false(is.null(serializer))
    expect_match(class(serializer), "_p_librdf_serializer")
    base = librdf_new_uri(world, "http://example.org/base.rdf");
    filePath <- tempfile(pattern = "file", tmpdir = tempdir(), fileext = ".rdf")

    librdf_serializer_serialize_model_to_file(serializer,filePath,base,model);
    expect_true(file.exists(filePath))
    unlink(filePath)

    # Free resources
    librdf_free_serializer(serializer);
    librdf_free_uri(base);
    librdf_free_model(model);
    librdf_free_storage(storage);
})
