Skip to content

Commit

Permalink
Move v1 corpus to files
Browse files Browse the repository at this point in the history
  • Loading branch information
theory committed Jul 30, 2024
1 parent 36bd351 commit 22a6b1c
Show file tree
Hide file tree
Showing 9 changed files with 164 additions and 116 deletions.
86 changes: 43 additions & 43 deletions src/valid/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -124,46 +124,46 @@ fn is_license(v: &Value) -> Result<(), Box<dyn Error>> {
Ok(())
}

#[cfg(test)]
mod tests {
use super::*;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::error::Error;
use std::io::{prelude::*, BufReader};
use std::path::PathBuf;

#[derive(Deserialize, Serialize)]
struct CorpusCase {
test: String,
error: Option<String>,
meta: Value,
}

#[test]
fn test_validator() -> Result<(), Box<dyn Error>> {
let schemas_dir: PathBuf = [env!("CARGO_MANIFEST_DIR"), "schema"].iter().collect();

let mut validator = Validator::new(schemas_dir)?;
let valid_file: PathBuf = [
env!("CARGO_MANIFEST_DIR"),
"tests",
"corpus",
"v1",
"valid.txt",
]
.iter()
.collect();
let file = File::open(&valid_file)?;
let reader = BufReader::new(file);
for line in reader.lines() {
let tc: CorpusCase = serde_json::from_str(&line?)?;
if let Err(e) = validator.validate(&tc.meta) {
panic!("{} failed: {e}", &tc.test);
}
println!("Example {} ok", &tc.test);
}

Ok(())
}
}
// #[cfg(test)]
// mod tests {
// use super::*;
// use serde::{Deserialize, Serialize};
// use serde_json::Value;
// use std::error::Error;
// use std::io::{prelude::*, BufReader};
// use std::path::PathBuf;

// #[derive(Deserialize, Serialize)]
// struct CorpusCase {
// test: String,
// error: Option<String>,
// meta: Value,
// }

// #[test]
// fn test_validator() -> Result<(), Box<dyn Error>> {
// let schemas_dir: PathBuf = [env!("CARGO_MANIFEST_DIR"), "schema"].iter().collect();

// let mut validator = Validator::new(schemas_dir)?;
// let valid_file: PathBuf = [
// env!("CARGO_MANIFEST_DIR"),
// "tests",
// "corpus",
// "v1",
// "valid.txt",
// ]
// .iter()
// .collect();
// let file = File::open(&valid_file)?;
// let reader = BufReader::new(file);
// for line in reader.lines() {
// let tc: CorpusCase = serde_json::from_str(&line?)?;
// if let Err(e) = validator.validate(&tc.meta) {
// panic!("{} failed: {e}", &tc.test);
// }
// println!("Example {} ok", &tc.test);
// }

// Ok(())
// }
// }
25 changes: 25 additions & 0 deletions tests/common/mod.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
use std::fs::{self, File};
use std::path::PathBuf;
use std::{collections::HashMap, error::Error};

use boon::{Compiler, Schemas};
use pgxn_meta::*;
use serde_json::{json, Value};
use wax::Glob;

const SCHEMA_BASE: &str = "https://pgxn.org/meta/v";

Expand Down Expand Up @@ -237,3 +240,25 @@ pub fn test_schema_version(version: u8) -> Result<(), Box<dyn Error>> {

Ok(())
}

pub fn test_corpus(version: u8) -> Result<(), Box<dyn Error>> {
let schemas_dir: PathBuf = [env!("CARGO_MANIFEST_DIR"), "schema"].iter().collect();
let mut validator = Validator::new(schemas_dir)?;
let v_dir = format!("v{version}");

let dir: PathBuf = [env!("CARGO_MANIFEST_DIR"), "tests", "corpus", &v_dir]
.iter()
.collect();
let glob = Glob::new("*.json")?;

for path in glob.walk(dir) {
let path = path?.into_path();
let meta: Value = serde_json::from_reader(File::open(&path)?)?;
if let Err(e) = validator.validate(&meta) {
panic!("{v_dir}/{:?} failed: {e}", path.file_name().unwrap());
}
println!("Example {v_dir}/{:?} ok", path.file_name().unwrap());
}

Ok(())
}
19 changes: 19 additions & 0 deletions tests/corpus/v1/howto.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"name": "pair",
"abstract": "A key/value pair data type",
"version": "0.1.0",
"maintainer": "David E. Wheeler <[email protected]>",
"license": "postgresql",
"provides": {
"pair": {
"abstract": "A key/value pair data type",
"file": "sql/pair.sql",
"docfile": "doc/pair.md",
"version": "0.1.0"
}
},
"meta-spec": {
"version": "1.0.0",
"url": "https://pgxn.org/meta/spec.txt"
}
}
39 changes: 39 additions & 0 deletions tests/corpus/v1/howto2.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{
"name": "pair",
"abstract": "A key/value pair data type",
"description": "This library contains a single PostgreSQL extension, a key/value pair data type called “pair”, along with a convenience function for constructing key/value pairs.",
"version": "0.1.4",
"maintainer": ["David E. Wheeler <[email protected]>"],
"license": "postgresql",
"provides": {
"pair": {
"abstract": "A key/value pair data type",
"file": "sql/pair.sql",
"docfile": "doc/pair.md",
"version": "0.1.0"
}
},
"resources": {
"bugtracker": {
"web": "https://github.com/theory/kv-pair/issues/"
},
"repository": {
"url": "git://github.com/theory/kv-pair.git",
"web": "https://github.com/theory/kv-pair/",
"type": "git"
}
},
"generated_by": "David E. Wheeler",
"meta-spec": {
"version": "1.0.0",
"url": "https://pgxn.org/meta/spec.txt"
},
"tags": [
"variadic function",
"ordered pair",
"pair",
"key value",
"key value pair",
"data type"
]
}
1 change: 0 additions & 1 deletion tests/corpus/v1/invalid.txt

This file was deleted.

3 changes: 0 additions & 3 deletions tests/corpus/v1/valid.txt

This file was deleted.

36 changes: 36 additions & 0 deletions tests/corpus/v1/widget.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"name": "widget",
"abstract": "Widget for PostgreSQL",
"description": "¿A widget is just thing thing, yoŭ know?",
"version": "0.2.5",
"maintainer": ["David E. Wheeler <[email protected]>"],
"license": {
"PostgreSQL": "https://www.postgresql.org/about/licence"
},
"prereqs": {
"runtime": {
"requires": {
"plpgsql": 0,
"PostgreSQL": "8.0.0"
},
"recommends": {
"PostgreSQL": "8.4.0"
}
}
},
"provides": {
"widget": {
"file": "sql/widget.sql.in",
"version": "0.2.5"
}
},
"resources": {
"homepage": "http://widget.example.org/"
},
"generated_by": "theory",
"meta-spec": {
"version": "1.0.0",
"url": "https://pgxn.org/meta/spec.txt"
},
"tags": ["widget", "gadget", "full text search"]
}
48 changes: 1 addition & 47 deletions tests/v1_schema_test.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
use std::error::Error;
use std::fs::File;
use std::io::{prelude::*, BufReader};

use boon::Schemas;
use serde::{Deserialize, Serialize};
Expand Down Expand Up @@ -28,51 +26,7 @@ struct CorpusCase {

#[test]
fn test_corpus_v1_valid() -> Result<(), Box<dyn Error>> {
// Load the schemas and compile the root schema.
let mut compiler = new_compiler("schema/v1")?;
let mut schemas = Schemas::new();
let id = id_for(SCHEMA_VERSION, "distribution");
let index = compiler.compile(&id, &mut schemas)?;

// Test each meta JSON in the corpus.
let file = File::open("tests/corpus/v1/valid.txt")?;
let reader = BufReader::new(file);
for line in reader.lines() {
let tc: CorpusCase = serde_json::from_str(&line?)?;

if let Err(e) = schemas.validate(&tc.meta, index) {
panic!("{} failed: {e}", &tc.test);
}
println!("Example {} ok", &tc.test);
}

Ok(())
}

#[test]
fn test_corpus_v1_invalid() -> Result<(), Box<dyn Error>> {
// Load the schemas and compile the root schema.
let mut compiler = new_compiler("schema/v1")?;
let mut schemas = Schemas::new();
let id = id_for(SCHEMA_VERSION, "distribution");
let index = compiler.compile(&id, &mut schemas)?;

// Test each meta JSON in the corpus.
let file = File::open("tests/corpus/v1/invalid.txt")?;
let reader = BufReader::new(file);
for line in reader.lines() {
let tc: CorpusCase = serde_json::from_str(&line?)?;
match schemas.validate(&tc.meta, index) {
Ok(_) => panic!("{} unexpectedly passed!", &tc.test),
Err(e) => assert!(
e.to_string().contains(&tc.error.unwrap()),
"{} error: {e}",
&tc.test,
),
}
}

Ok(())
test_corpus(1)
}

#[test]
Expand Down
23 changes: 1 addition & 22 deletions tests/v2_schema_test.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,14 @@
use std::error::Error;
use std::fs::File;
use std::path::PathBuf;

use boon::Schemas;
use serde::{Deserialize, Serialize};
use serde_json::{json, Map, Value};
use wax::Glob;

// importing common module.
mod common;
use common::*;

use pgxn_meta::valid::_test_support::*;
use pgxn_meta::*;

const SCHEMA_VERSION: u8 = 2;

Expand Down Expand Up @@ -3348,22 +3344,5 @@ struct CorpusCase {

#[test]
fn test_corpus_v2_valid() -> Result<(), Box<dyn Error>> {
let schemas_dir: PathBuf = [env!("CARGO_MANIFEST_DIR"), "schema"].iter().collect();
let mut validator = Validator::new(schemas_dir)?;

let dir: PathBuf = [env!("CARGO_MANIFEST_DIR"), "tests", "corpus", "v2"]
.iter()
.collect();
let glob = Glob::new("*.json")?;

for path in glob.walk(dir) {
let path = path?.into_path();
let meta: Value = serde_json::from_reader(File::open(&path)?)?;
if let Err(e) = validator.validate(&meta) {
panic!("{:?} failed: {e}", path.file_name().unwrap());
}
println!("Example {:?} ok", path.file_name().unwrap());
}

Ok(())
test_corpus(2)
}

0 comments on commit 22a6b1c

Please sign in to comment.