#  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 rdft:   <http://www.w3.org/ns/rdftest#>
PREFIX :       <#>

<>  rdf:type mf:Manifest ;
    rdfs:label "Turtle*" ;
    mf:entries
    (
        :turtle-star-1
        :turtle-star-2
        :turtle-star-3
        :turtle-star-4
        :turtle-star-5
        :turtle-star-6
        :turtle-star-7

        :turtle-star-bad-1
        :turtle-star-bad-2
        :turtle-star-bad-3
        :turtle-star-bad-4
        :turtle-star-bad-5
    ) .

## Good Syntax

:turtle-star-1 rdf:type rdft:TestTurtlePositiveSyntax ;
   mf:name      "turtle-star-syntax-01" ;
   mf:action    <turtle-star-syntax-01.ttl> ;
   .

:turtle-star-2 rdf:type rdft:TestTurtlePositiveSyntax ;
   mf:name      "turtle-star-syntax-02" ;
   mf:action    <turtle-star-syntax-02.ttl> ;
   .

:turtle-star-3 rdf:type rdft:TestTurtlePositiveSyntax ;
   mf:name      "turtle-star-syntax-03" ;
   mf:action    <turtle-star-syntax-03.ttl> ;
   .

:turtle-star-4 rdf:type rdft:TestTurtlePositiveSyntax ;
   mf:name      "turtle-star-syntax-04" ;
   mf:action    <turtle-star-syntax-04.ttl> ;
   .

:turtle-star-5 rdf:type rdft:TestTurtlePositiveSyntax ;
   mf:name      "turtle-star-syntax-05" ;
   mf:action    <turtle-star-syntax-05.ttl> ;
   .

:turtle-star-6 rdf:type rdft:TestTurtlePositiveSyntax ;
   mf:name      "turtle-star-syntax-06" ;
   mf:action    <turtle-star-syntax-06.ttl> ;
   .

:turtle-star-7 rdf:type rdft:TestTurtlePositiveSyntax ;
   mf:name      "turtle-star-syntax-07" ;
   mf:action    <turtle-star-syntax-07.ttl> ;
   .

## Bad Syntax

:turtle-star-bad-1 rdf:type rdft:TestTurtleNegativeSyntax ;
    mf:name    "turtle-star-syntax-bad-01" ;
    rdfs:comment "" ;
    mf:action    <turtle-star-syntax-bad-01.ttl> ;
    .

:turtle-star-bad-2 rdf:type rdft:TestTurtleNegativeSyntax ;
    mf:name    "turtle-star-syntax-bad-02" ;
    rdfs:comment "" ;
    mf:action    <turtle-star-syntax-bad-02.ttl> ;
    .

:turtle-star-bad-3 rdf:type rdft:TestTurtleNegativeSyntax ;
    mf:name    "turtle-star-syntax-bad-03" ;
    rdfs:comment "" ;
    mf:action    <turtle-star-syntax-bad-03.ttl> ;
    .

:turtle-star-bad-4 rdf:type rdft:TestTurtleNegativeSyntax ;
    mf:name    "turtle-star-syntax-bad-04" ;
    rdfs:comment "" ;
    mf:action    <turtle-star-syntax-bad-04.ttl> ;
    .

:turtle-star-bad-5 rdf:type rdft:TestTurtleNegativeSyntax ;
    mf:name    "turtle-star-syntax-bad-05" ;
    rdfs:comment "" ;
    mf:action    <turtle-star-syntax-bad-05.ttl> ;
    .
