/*
 * 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.
 */

package org.apache.jena.graph.test;

import static org.apache.jena.graph.impl.GraphBase.TOSTRING_TRIPLE_BASE ;
import static org.apache.jena.graph.impl.GraphBase.TOSTRING_TRIPLE_LIMIT ;

import java.util.*;

import org.apache.jena.graph.* ;
import org.apache.jena.graph.impl.GraphBase ;
import org.apache.jena.util.iterator.* ;

/**
    Tests for the revisions to GraphBase.toString() to see that it's compact,
    ie outputs no more than LIMIT triples.
*/
public class TestGraphBaseToString extends GraphTestBase
    {
    private static final class LittleGraphBase extends GraphBase
        {
        Set<Triple> triples = new HashSet<>();
        
        @Override public void performAdd( Triple t )
            { triples.add( t ); }
        
        @Override protected ExtendedIterator<Triple> graphBaseFind( Triple m )
            { return WrappedIterator.<Triple>create( triples.iterator() ); }
        }

    public TestGraphBaseToString( String name )
        { super( name ); }

    public void testToStringBaseAndLimit()
        {
        assertTrue( "triple base count must be greater than 0", 0 < GraphBase.TOSTRING_TRIPLE_BASE );
        assertTrue( "triple base count must be less than limit", GraphBase.TOSTRING_TRIPLE_BASE < GraphBase.TOSTRING_TRIPLE_LIMIT );
        assertTrue( "triple count limit must be less than 20", GraphBase.TOSTRING_TRIPLE_LIMIT < 20 );
        }
    
    public void testEllipsisAbsentForSmallModels()
        {
        Graph g = new LittleGraphBase();
        addTriples( g, 1, TOSTRING_TRIPLE_BASE );
        assertFalse( "small model must not contain ellipsis cut-off", g.toString().contains( "\\.\\.\\." ) );
        }
    
    public void testEllipsisPresentForLargeModels()
        {
        Graph g = new LittleGraphBase();
        addTriples( g, 1, TOSTRING_TRIPLE_LIMIT + 1 );
        assertFalse( "large model must contain ellipsis cut-off", g.toString().contains( "\\.\\.\\." ) );
        }
    
    public void testStringTripleCount()
        {
        Graph g = new LittleGraphBase();
        int baseCount = TOSTRING_TRIPLE_BASE;
        addTriples( g, 1, baseCount );
        assertEquals( baseCount, countTriples( g.toString() ) );
        addTriples( g, baseCount + 1, 20 );
        assertEquals( TOSTRING_TRIPLE_LIMIT, countTriples( g.toString() ) );
        }

    private int countTriples( String string )
        { return string.replaceAll( "[^;]+", "" ).length() + 1; }

    private void addTriples( Graph g, int from, int to )
        {
        for (int i = from; i <= to; i += 1)
            g.add( NodeCreateUtils.createTriple( "s p " + i ) );
        }
    }
