#  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.

@prefix rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:	<http://www.w3.org/2000/01/rdf-schema#> .
@prefix mf:     <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#> .
@prefix qt:     <http://www.w3.org/2001/sw/DataAccess/tests/test-query#> .

<>  rdf:type mf:Manifest ;
    rdfs:label "SPARQL Query Evaluation tests" ;
    mf:include (
        <basic/manifest.ttl>
        <triple-match/manifest.ttl>

        <open-world/manifest.ttl>
        <algebra/manifest.ttl>
        <bnode-coreference/manifest.ttl>

        <optional/manifest.ttl>
        <optional-filter/manifest.ttl>
        <graph/manifest.ttl>
        <dataset/manifest.ttl>

        <type-promotion/manifest.ttl>
        <cast/manifest.ttl>
        <boolean-effective-value/manifest.ttl>
        <bound/manifest.ttl>
        <expr-builtin/manifest.ttl>
        <expr-ops/manifest.ttl>
        <expr-equals/manifest.ttl>
        <regex/manifest.ttl>
    # Needs the data parser fixing (less strict)
       # <i18n/manifest.ttl>

        <construct/manifest.ttl>
        <ask/manifest.ttl>
        <distinct/manifest.ttl>
        <sort/manifest.ttl>
        <solution-seq/manifest.ttl>

        <reduced/manifest.ttl>
    ).

