Home | History | Annotate | Download | only in pyyaml
      1 /**
      2  * Copyright (c) 2008, http://www.snakeyaml.org
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *     http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package org.pyyaml;
     17 
     18 import java.io.File;
     19 import java.io.FileInputStream;
     20 import java.io.FileNotFoundException;
     21 import java.io.IOException;
     22 import java.io.InputStream;
     23 import java.util.ArrayList;
     24 import java.util.HashMap;
     25 import java.util.List;
     26 import java.util.Map;
     27 
     28 import org.yaml.snakeyaml.reader.StreamReader;
     29 import org.yaml.snakeyaml.reader.UnicodeReader;
     30 import org.yaml.snakeyaml.scanner.Scanner;
     31 import org.yaml.snakeyaml.scanner.ScannerImpl;
     32 import org.yaml.snakeyaml.tokens.AliasToken;
     33 import org.yaml.snakeyaml.tokens.AnchorToken;
     34 import org.yaml.snakeyaml.tokens.BlockEndToken;
     35 import org.yaml.snakeyaml.tokens.BlockEntryToken;
     36 import org.yaml.snakeyaml.tokens.BlockMappingStartToken;
     37 import org.yaml.snakeyaml.tokens.BlockSequenceStartToken;
     38 import org.yaml.snakeyaml.tokens.DirectiveToken;
     39 import org.yaml.snakeyaml.tokens.DocumentEndToken;
     40 import org.yaml.snakeyaml.tokens.DocumentStartToken;
     41 import org.yaml.snakeyaml.tokens.FlowEntryToken;
     42 import org.yaml.snakeyaml.tokens.FlowMappingEndToken;
     43 import org.yaml.snakeyaml.tokens.FlowMappingStartToken;
     44 import org.yaml.snakeyaml.tokens.FlowSequenceEndToken;
     45 import org.yaml.snakeyaml.tokens.FlowSequenceStartToken;
     46 import org.yaml.snakeyaml.tokens.KeyToken;
     47 import org.yaml.snakeyaml.tokens.ScalarToken;
     48 import org.yaml.snakeyaml.tokens.StreamEndToken;
     49 import org.yaml.snakeyaml.tokens.StreamStartToken;
     50 import org.yaml.snakeyaml.tokens.TagToken;
     51 import org.yaml.snakeyaml.tokens.Token;
     52 import org.yaml.snakeyaml.tokens.ValueToken;
     53 
     54 /**
     55  * imported from PyYAML
     56  */
     57 public class PyTokensTest extends PyImportTest {
     58 
     59     public void testTokens() throws FileNotFoundException {
     60         Map<Class<?>, String> replaces = new HashMap<Class<?>, String>();
     61         replaces.put(DirectiveToken.class, "%");
     62         replaces.put(DocumentStartToken.class, "---");
     63         replaces.put(DocumentEndToken.class, "...");
     64         replaces.put(AliasToken.class, "*");
     65         replaces.put(AnchorToken.class, "&");
     66         replaces.put(TagToken.class, "!");
     67         replaces.put(ScalarToken.class, "_");
     68         replaces.put(BlockSequenceStartToken.class, "[[");
     69         replaces.put(BlockMappingStartToken.class, "{{");
     70         replaces.put(BlockEndToken.class, "]}");
     71         replaces.put(FlowSequenceStartToken.class, "[");
     72         replaces.put(FlowSequenceEndToken.class, "]");
     73         replaces.put(FlowMappingStartToken.class, "{");
     74         replaces.put(FlowMappingEndToken.class, "}");
     75         replaces.put(BlockEntryToken.class, ",");
     76         replaces.put(FlowEntryToken.class, ",");
     77         replaces.put(KeyToken.class, "?");
     78         replaces.put(ValueToken.class, ":");
     79         //
     80         File[] tokensFiles = getStreamsByExtension(".tokens");
     81         assertTrue("No test files found.", tokensFiles.length > 0);
     82         for (int i = 0; i < tokensFiles.length; i++) {
     83             String name = tokensFiles[i].getName();
     84             int position = name.lastIndexOf('.');
     85             String dataName = name.substring(0, position) + ".data";
     86             //
     87             String tokenFileData = getResource(name);
     88             String[] split = tokenFileData.split("\\s+");
     89             List<String> tokens2 = new ArrayList<String>();
     90             for (int j = 0; j < split.length; j++) {
     91                 tokens2.add(split[j]);
     92             }
     93             //
     94             List<String> tokens1 = new ArrayList<String>();
     95             StreamReader reader = new StreamReader(new UnicodeReader(new FileInputStream(
     96                     getFileByName(dataName))));
     97             Scanner scanner = new ScannerImpl(reader);
     98             try {
     99                 while (scanner.checkToken(new Token.ID[0])) {
    100                     Token token = scanner.getToken();
    101                     if (!(token instanceof StreamStartToken || token instanceof StreamEndToken)) {
    102                         String replacement = replaces.get(token.getClass());
    103                         tokens1.add(replacement);
    104                     }
    105                 }
    106                 assertEquals(tokenFileData, tokens1.size(), tokens2.size());
    107                 assertEquals(tokens1, tokens2);
    108             } catch (RuntimeException e) {
    109                 System.out.println("File name: \n" + tokensFiles[i].getName());
    110                 String data = getResource(tokensFiles[i].getName());
    111                 System.out.println("Data: \n" + data);
    112                 System.out.println("Tokens:");
    113                 for (String token : tokens1) {
    114                     System.out.println(token);
    115                 }
    116                 fail("Cannot scan: " + tokensFiles[i]);
    117             }
    118         }
    119     }
    120 
    121     public void testScanner() throws IOException {
    122         File[] files = getStreamsByExtension(".data", true);
    123         assertTrue("No test files found.", files.length > 0);
    124         for (File file : files) {
    125             List<String> tokens = new ArrayList<String>();
    126             InputStream input = new FileInputStream(file);
    127             StreamReader reader = new StreamReader(new UnicodeReader(input));
    128             Scanner scanner = new ScannerImpl(reader);
    129             try {
    130                 while (scanner.checkToken(new Token.ID[0])) {
    131                     Token token = scanner.getToken();
    132                     tokens.add(token.getClass().getName());
    133                 }
    134             } catch (RuntimeException e) {
    135                 System.out.println("File name: \n" + file.getName());
    136                 String data = getResource(file.getName());
    137                 System.out.println("Data: \n" + data);
    138                 System.out.println("Tokens:");
    139                 for (String token : tokens) {
    140                     System.out.println(token);
    141                 }
    142                 fail("Cannot scan: " + file + "; " + e.getMessage());
    143             } finally {
    144                 input.close();
    145             }
    146         }
    147     }
    148 }
    149