Change empty scalar definition

This commit is contained in:
Yuheng Chen 2015-05-27 21:57:42 +08:00
parent 44b1b631e2
commit ef020f0f95
4 changed files with 1667 additions and 1 deletions

View file

@ -46,7 +46,8 @@ pub enum Event {
impl Event {
fn empty_scalar() -> Event {
Event::Scalar(String::new(), TScalarStyle::Plain)
// a null scalar
Event::Scalar("~".to_string(), TScalarStyle::Plain)
}
}

67
saphyr/tests/spec_test.rs Normal file
View file

@ -0,0 +1,67 @@
#![allow(dead_code)]
extern crate yaml_rust;
use yaml_rust::parser::{Parser, EventReceiver, Event};
use yaml_rust::yaml::Yaml;
#[derive(Clone, PartialEq, PartialOrd, Debug)]
enum TestEvent {
OnDocumentStart,
OnDocumentEnd,
OnSequenceStart,
OnSequenceEnd,
OnMapStart,
OnMapEnd,
OnScalar,
OnAlias,
OnNull,
}
struct YamlChecker {
pub evs: Vec<TestEvent>
}
impl EventReceiver for YamlChecker {
fn on_event(&mut self, ev: &Event) {
let tev = match *ev {
Event::DocumentStart => TestEvent::OnDocumentStart,
Event::DocumentEnd => TestEvent::OnDocumentEnd,
Event::SequenceStart => TestEvent::OnSequenceStart,
Event::SequenceEnd => TestEvent::OnSequenceEnd,
Event::MappingStart => TestEvent::OnMapStart,
Event::MappingEnd => TestEvent::OnMapEnd,
Event::Scalar(ref v, style) => {
if v == "~" {
TestEvent::OnNull
} else {
TestEvent::OnScalar
}
},
_ => { return } // ignore other events
};
self.evs.push(tev);
}
}
fn str_to_test_events(docs: &str) -> Vec<TestEvent> {
let mut p = YamlChecker {
evs: Vec::new()
};
let mut parser = Parser::new(docs.chars());
parser.load(&mut p, true).unwrap();
p.evs
}
macro_rules! assert_next {
($v:expr, $p:pat) => (
match $v.next().unwrap() {
$p => {},
e => { panic!("unexpected event: {:?}", e); }
}
)
}
// auto generated from handler_spec_test.cpp
include!("specexamples.rs.inc");
include!("spec_test.rs.inc");

66
saphyr/tests/specs/cpp2rust.rb Executable file
View file

@ -0,0 +1,66 @@
#!/usr/bin/env ruby
TEST_REGEX = /TEST_F\([a-zA-Z0-9_]+,\s+([a-zA-Z0-9_]+)\)/
class Context
attr_accessor :name, :ev, :src
def initialize
@name = ""
@src = ""
@ev = []
end
end
class String
def snakecase
self
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
.tr('-', '_')
.gsub(/\s/, '_')
.gsub(/__+/, '_')
.downcase
end
end
ctx = nil
tests = []
IO.foreach(ARGV[0]) do |line|
line.strip!
if ctx
fail "unexpected TEST_F" if line =~ TEST_REGEX
if line =~ /^}/
tests << ctx
ctx = nil
end
if line =~ /^EXPECT_CALL/
fail 'not end with ;' unless line[-1] == ';'
v = line.gsub('(', ' ').gsub(')', ' ').split
ctx.ev << v[2]
end
else
next unless line =~ TEST_REGEX
name = $1
next unless name =~ /^(Ex\d+_\d+)/
str = $1.upcase
$stderr.puts "found #{name}"
ctx = Context.new
ctx.name = "test_#{name.snakecase}"
ctx.src = str
end
end
# code gen
tests.each do |t|
next if t.ev.size == 0
puts "#[test]"
puts "fn #{t.name}() {"
puts " let mut v = str_to_test_events(#{t.src}).into_iter();"
t.ev.each do |e|
puts " assert_next!(v, TestEvent::#{e});"
end
puts "}"
puts
end

File diff suppressed because it is too large Load diff