--- /dev/null
+#![cfg(feature = "diesel")]\r
+\r
+#[macro_use]\r
+extern crate diesel;\r
+extern crate semver;\r
+\r
+use diesel::connection::SimpleConnection;\r
+use diesel::sql_types::Text;\r
+use diesel::*;\r
+use semver::{Version, VersionReq};\r
+\r
+table! {\r
+ versions (name) {\r
+ name -> Text,\r
+ vers -> Text,\r
+ }\r
+}\r
+\r
+table! {\r
+ version_reqs (name) {\r
+ name -> Text,\r
+ req -> Text,\r
+ }\r
+}\r
+\r
+fn connection() -> SqliteConnection {\r
+ let conn = SqliteConnection::establish(":memory:").unwrap();\r
+ conn.batch_execute(\r
+ "\r
+ CREATE TABLE versions (name TEXT PRIMARY KEY NOT NULL, vers TEXT NOT NULL);\r
+ CREATE TABLE version_reqs (name TEXT PRIMARY KEY NOT NULL, req TEXT NOT NULL);\r
+ ",\r
+ )\r
+ .unwrap();\r
+ conn\r
+}\r
+\r
+const VERSIONS_TO_TEST: &[&str] = &[\r
+ "0.0.1",\r
+ "0.1.0",\r
+ "1.0.0",\r
+ "1.0.0-beta1",\r
+ "1.0.0-beta.1",\r
+ "1.0.0+129384712983",\r
+ "1.0.0-beta.1+1234.5678",\r
+];\r
+\r
+#[test]\r
+fn version_round_trips() {\r
+ let conn = connection();\r
+ for version in VERSIONS_TO_TEST {\r
+ let version = version.parse::<Version>().unwrap();\r
+ let result = select(version.as_sql::<Text>()).get_result(&conn);\r
+ assert_eq!(Ok(version), result);\r
+ }\r
+}\r
+\r
+#[test]\r
+fn version_inserts_and_loads() {\r
+ use self::versions::dsl::*;\r
+\r
+ let conn = connection();\r
+ let semver_versions = VERSIONS_TO_TEST\r
+ .iter()\r
+ .enumerate()\r
+ .map(|(i, v)| (format!("Version {}", i), v.parse::<Version>().unwrap()))\r
+ .collect::<Vec<_>>();\r
+\r
+ let new_versions = semver_versions\r
+ .iter()\r
+ .map(|&(ref n, ref v)| (name.eq(n), vers.eq(v)))\r
+ .collect::<Vec<_>>();\r
+ let inserted_rows = insert_into(versions).values(&new_versions).execute(&conn);\r
+ assert_eq!(Ok(VERSIONS_TO_TEST.len()), inserted_rows);\r
+\r
+ let actual_data = versions.load(&conn);\r
+ assert_eq!(Ok(semver_versions.clone()), actual_data);\r
+}\r
+\r
+#[test]\r
+fn version_inserts_and_loads_on_struct() {\r
+ #[derive(Debug, PartialEq, Queryable, Insertable)]\r
+ #[table_name = "versions"]\r
+ struct Versioned {\r
+ name: String,\r
+ vers: Version,\r
+ }\r
+\r
+ let conn = connection();\r
+ let semver_versions = VERSIONS_TO_TEST\r
+ .iter()\r
+ .enumerate()\r
+ .map(|(i, v)| Versioned {\r
+ name: format!("Version {}", i),\r
+ vers: v.parse::<Version>().unwrap(),\r
+ })\r
+ .collect::<Vec<_>>();\r
+\r
+ let inserted_rows = insert_into(versions::table)\r
+ .values(&semver_versions)\r
+ .execute(&conn);\r
+ assert_eq!(Ok(VERSIONS_TO_TEST.len()), inserted_rows);\r
+\r
+ let actual_data = versions::table.load(&conn);\r
+ assert_eq!(Ok(semver_versions), actual_data);\r
+}\r
+\r
+const VERSION_REQS_TO_TEST: &[&str] = &[\r
+ "^1.0.0",\r
+ "= 1.0.0",\r
+ "= 0.9.0",\r
+ "= 0.1.0-beta2.a",\r
+ ">= 1.0.0",\r
+ ">= 2.1.0-alpha2",\r
+ "< 1.0.0",\r
+ "<= 2.1.0-alpha2",\r
+ "^ 1.2.3+meta",\r
+ "= 1.2.3+meta",\r
+ "> 1.2.3+meta",\r
+ ">= 1.2.3+meta",\r
+ "< 1.2.3+meta",\r
+ "<= 1.2.3+meta",\r
+ "~ 1.2.3+meta",\r
+ "> 0.0.9, <= 2.5.3",\r
+ "0.3.0, 0.4.0",\r
+ "<= 0.2.0, >= 0.5.0",\r
+ "0.1.0, 0.1.4, 0.1.6",\r
+ ">=0.5.1-alpha3, <0.6",\r
+ "~1",\r
+ "~1.2",\r
+ "~1.2.2",\r
+ "~1.2.3-beta.2",\r
+ "^1",\r
+ "^1.1",\r
+ "^1.1.2",\r
+ "^0.1.2",\r
+ "^0.5.1-alpha3",\r
+ "",\r
+ "*",\r
+ "x",\r
+ "1.*",\r
+];\r
+\r
+#[test]\r
+fn version_req_round_trips() {\r
+ let conn = connection();\r
+ for version_req in VERSION_REQS_TO_TEST {\r
+ let version_req = version_req.parse::<VersionReq>().unwrap();\r
+ let result = select(version_req.as_sql::<Text>()).get_result(&conn);\r
+ assert_eq!(Ok(version_req), result);\r
+ }\r
+}\r
+\r
+#[test]\r
+fn version_req_inserts_and_loads() {\r
+ use self::version_reqs::dsl::*;\r
+\r
+ let conn = connection();\r
+ let semver_version_reqs = VERSION_REQS_TO_TEST\r
+ .iter()\r
+ .enumerate()\r
+ .map(|(i, v)| {\r
+ (\r
+ format!("VersionReq {}", i),\r
+ v.parse::<VersionReq>().unwrap(),\r
+ )\r
+ })\r
+ .collect::<Vec<_>>();\r
+\r
+ let new_version_reqs = semver_version_reqs\r
+ .iter()\r
+ .map(|&(ref n, ref v)| (name.eq(n), req.eq(v)))\r
+ .collect::<Vec<_>>();\r
+ let inserted_rows = insert_into(version_reqs)\r
+ .values(&new_version_reqs)\r
+ .execute(&conn);\r
+ assert_eq!(Ok(VERSION_REQS_TO_TEST.len()), inserted_rows);\r
+\r
+ let actual_data = version_reqs.load(&conn);\r
+ assert_eq!(Ok(semver_version_reqs.clone()), actual_data);\r
+}\r
+\r
+#[test]\r
+fn version_req_inserts_and_loads_on_struct() {\r
+ #[derive(Debug, PartialEq, Queryable, Insertable)]\r
+ #[table_name = "version_reqs"]\r
+ struct VersionReqed {\r
+ name: String,\r
+ req: VersionReq,\r
+ }\r
+\r
+ let conn = connection();\r
+ let semver_version_reqs = VERSION_REQS_TO_TEST\r
+ .iter()\r
+ .enumerate()\r
+ .map(|(i, v)| VersionReqed {\r
+ name: format!("VersionReq {}", i),\r
+ req: v.parse::<VersionReq>().unwrap(),\r
+ })\r
+ .collect::<Vec<_>>();\r
+\r
+ let inserted_rows = insert_into(version_reqs::table)\r
+ .values(&semver_version_reqs)\r
+ .execute(&conn);\r
+ assert_eq!(Ok(VERSION_REQS_TO_TEST.len()), inserted_rows);\r
+\r
+ let actual_data = version_reqs::table.load(&conn);\r
+ assert_eq!(Ok(semver_version_reqs), actual_data);\r
+}\r