1 2 // Copyright Ferdinand Majerech 2011. 3 // Distributed under the Boost Software License, Version 1.0. 4 // (See accompanying file LICENSE_1_0.txt or copy at 5 // http://www.boost.org/LICENSE_1_0.txt) 6 7 module dyaml.test.tokens; 8 9 10 version(unittest) 11 { 12 13 import std.array; 14 import std.file; 15 16 import dyaml.test.common; 17 import dyaml.reader; 18 import dyaml.scanner; 19 import dyaml.token; 20 21 // Read and scan a YAML doc, returning the tokens. 22 const(Token)[] scanTestCommon(string filename) @safe 23 { 24 ubyte[] yamlData; 25 () @trusted { yamlData = cast(ubyte[])std.file.read(filename); }(); 26 auto scanner = Scanner(new Reader(yamlData)); 27 const(Token)[] result; 28 foreach (token; scanner) 29 { 30 result ~= token; 31 } 32 return result; 33 } 34 35 /** 36 * Test tokens output by scanner. 37 * 38 * Params: dataFilename = File to scan. 39 * tokensFilename = File containing expected tokens. 40 */ 41 void testTokens(string dataFilename, string tokensFilename) @safe 42 { 43 //representations of YAML tokens in tokens file. 44 auto replace = [ 45 TokenID.directive: "%", 46 TokenID.documentStart: "---", 47 TokenID.documentEnd: "...", 48 TokenID.alias_: "*", 49 TokenID.anchor: "&", 50 TokenID.tag: "!", 51 TokenID.scalar: "_", 52 TokenID.blockSequenceStart: "[[", 53 TokenID.blockMappingStart: "{{", 54 TokenID.blockEnd: "]}", 55 TokenID.flowSequenceStart: "[", 56 TokenID.flowSequenceEnd: "]", 57 TokenID.flowMappingStart: "{", 58 TokenID.flowMappingEnd: "}", 59 TokenID.blockEntry: ",", 60 TokenID.flowEntry: ",", 61 TokenID.key: "?", 62 TokenID.value: ":" 63 ]; 64 65 string[] tokens1; 66 string[] tokens2 = readText(tokensFilename).split(); 67 scope(exit) 68 { 69 static if(verbose){writeln("tokens1: ", tokens1, "\ntokens2: ", tokens2);} 70 } 71 72 foreach(token; scanTestCommon(dataFilename)) 73 { 74 if(token.id != TokenID.streamStart && token.id != TokenID.streamEnd) 75 { 76 tokens1 ~= replace[token.id]; 77 } 78 } 79 80 assert(tokens1 == tokens2); 81 } 82 83 /** 84 * Test scanner by scanning a file, expecting no errors. 85 * 86 * Params: dataFilename = File to scan. 87 * canonicalFilename = Another file to scan, in canonical YAML format. 88 */ 89 void testScanner(string dataFilename, string canonicalFilename) @safe 90 { 91 foreach(filename; [dataFilename, canonicalFilename]) 92 { 93 string[] tokens; 94 scope(exit) 95 { 96 static if(verbose){writeln(tokens);} 97 } 98 foreach(ref token; scanTestCommon(filename)) 99 { 100 tokens ~= to!string(token.id); 101 } 102 } 103 } 104 105 @safe unittest 106 { 107 printProgress("D:YAML tokens unittest"); 108 run("testTokens", &testTokens, ["data", "tokens"]); 109 run("testScanner", &testScanner, ["data", "canonical"]); 110 } 111 112 } // version(unittest)