summaryrefslogtreecommitdiff
path: root/cc/tests/test.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cc/tests/test.rs')
-rw-r--r--cc/tests/test.rs351
1 files changed, 351 insertions, 0 deletions
diff --git a/cc/tests/test.rs b/cc/tests/test.rs
new file mode 100644
index 0000000..7e5a28d
--- /dev/null
+++ b/cc/tests/test.rs
@@ -0,0 +1,351 @@
+extern crate cc;
+extern crate tempdir;
+
+use support::Test;
+
+mod support;
+
+#[test]
+fn gnu_smoke() {
+ let test = Test::gnu();
+ test.gcc()
+ .file("foo.c")
+ .compile("foo");
+
+ test.cmd(0)
+ .must_have("-O2")
+ .must_have("foo.c")
+ .must_not_have("-g")
+ .must_have("-c")
+ .must_have("-ffunction-sections")
+ .must_have("-fdata-sections");
+ test.cmd(1).must_have(test.td.path().join("foo.o"));
+}
+
+#[test]
+fn gnu_opt_level_1() {
+ let test = Test::gnu();
+ test.gcc()
+ .opt_level(1)
+ .file("foo.c")
+ .compile("foo");
+
+ test.cmd(0)
+ .must_have("-O1")
+ .must_not_have("-O2");
+}
+
+#[test]
+fn gnu_opt_level_s() {
+ let test = Test::gnu();
+ test.gcc()
+ .opt_level_str("s")
+ .file("foo.c")
+ .compile("foo");
+
+ test.cmd(0)
+ .must_have("-Os")
+ .must_not_have("-O1")
+ .must_not_have("-O2")
+ .must_not_have("-O3")
+ .must_not_have("-Oz");
+}
+
+#[test]
+fn gnu_debug() {
+ let test = Test::gnu();
+ test.gcc()
+ .debug(true)
+ .file("foo.c")
+ .compile("foo");
+ test.cmd(0).must_have("-g");
+}
+
+#[test]
+fn gnu_warnings_into_errors() {
+ let test = Test::gnu();
+ test.gcc()
+ .warnings_into_errors(true)
+ .file("foo.c")
+ .compile("foo");
+
+ test.cmd(0).must_have("-Werror");
+}
+
+#[test]
+fn gnu_warnings() {
+ let test = Test::gnu();
+ test.gcc()
+ .warnings(true)
+ .flag("-Wno-missing-field-initializers")
+ .file("foo.c")
+ .compile("foo");
+
+ test.cmd(0).must_have("-Wall")
+ .must_have("-Wextra");
+}
+
+#[test]
+fn gnu_warnings_overridable() {
+ let test = Test::gnu();
+ test.gcc()
+ .warnings(true)
+ .flag("-Wno-missing-field-initializers")
+ .file("foo.c")
+ .compile("foo");
+
+ test.cmd(0).must_have_in_order("-Wall", "-Wno-missing-field-initializers");
+}
+
+#[test]
+fn gnu_x86_64() {
+ for vendor in &["unknown-linux-gnu", "apple-darwin"] {
+ let target = format!("x86_64-{}", vendor);
+ let test = Test::gnu();
+ test.gcc()
+ .target(&target)
+ .host(&target)
+ .file("foo.c")
+ .compile("foo");
+
+ test.cmd(0)
+ .must_have("-fPIC")
+ .must_have("-m64");
+ }
+}
+
+#[test]
+fn gnu_x86_64_no_pic() {
+ for vendor in &["unknown-linux-gnu", "apple-darwin"] {
+ let target = format!("x86_64-{}", vendor);
+ let test = Test::gnu();
+ test.gcc()
+ .pic(false)
+ .target(&target)
+ .host(&target)
+ .file("foo.c")
+ .compile("foo");
+
+ test.cmd(0).must_not_have("-fPIC");
+ }
+}
+
+#[test]
+fn gnu_i686() {
+ for vendor in &["unknown-linux-gnu", "apple-darwin"] {
+ let target = format!("i686-{}", vendor);
+ let test = Test::gnu();
+ test.gcc()
+ .target(&target)
+ .host(&target)
+ .file("foo.c")
+ .compile("foo");
+
+ test.cmd(0)
+ .must_have("-m32");
+ }
+}
+
+#[test]
+fn gnu_i686_pic() {
+ for vendor in &["unknown-linux-gnu", "apple-darwin"] {
+ let target = format!("i686-{}", vendor);
+ let test = Test::gnu();
+ test.gcc()
+ .pic(true)
+ .target(&target)
+ .host(&target)
+ .file("foo.c")
+ .compile("foo");
+
+ test.cmd(0).must_have("-fPIC");
+ }
+}
+
+#[test]
+fn gnu_set_stdlib() {
+ let test = Test::gnu();
+ test.gcc()
+ .cpp_set_stdlib(Some("foo"))
+ .file("foo.c")
+ .compile("foo");
+
+ test.cmd(0).must_not_have("-stdlib=foo");
+}
+
+#[test]
+fn gnu_include() {
+ let test = Test::gnu();
+ test.gcc()
+ .include("foo/bar")
+ .file("foo.c")
+ .compile("foo");
+
+ test.cmd(0).must_have("-I").must_have("foo/bar");
+}
+
+#[test]
+fn gnu_define() {
+ let test = Test::gnu();
+ test.gcc()
+ .define("FOO", "bar")
+ .define("BAR", None)
+ .file("foo.c")
+ .compile("foo");
+
+ test.cmd(0).must_have("-DFOO=bar").must_have("-DBAR");
+}
+
+#[test]
+fn gnu_compile_assembly() {
+ let test = Test::gnu();
+ test.gcc()
+ .file("foo.S")
+ .compile("foo");
+ test.cmd(0).must_have("foo.S");
+}
+
+#[test]
+fn gnu_shared() {
+ let test = Test::gnu();
+ test.gcc()
+ .file("foo.c")
+ .shared_flag(true)
+ .static_flag(false)
+ .compile("foo");
+
+ test.cmd(0)
+ .must_have("-shared")
+ .must_not_have("-static");
+}
+
+#[test]
+fn gnu_flag_if_supported() {
+ if cfg!(windows) {
+ return
+ }
+ let test = Test::gnu();
+ test.gcc()
+ .file("foo.c")
+ .flag_if_supported("-Wall")
+ .flag_if_supported("-Wflag-does-not-exist")
+ .flag_if_supported("-std=c++11")
+ .compile("foo");
+
+ test.cmd(0)
+ .must_have("-Wall")
+ .must_not_have("-Wflag-does-not-exist")
+ .must_not_have("-std=c++11");
+}
+
+#[test]
+fn gnu_flag_if_supported_cpp() {
+ if cfg!(windows) {
+ return
+ }
+ let test = Test::gnu();
+ test.gcc()
+ .cpp(true)
+ .file("foo.cpp")
+ .flag_if_supported("-std=c++11")
+ .compile("foo");
+
+ test.cmd(0)
+ .must_have("-std=c++11");
+}
+
+#[test]
+fn gnu_static() {
+ let test = Test::gnu();
+ test.gcc()
+ .file("foo.c")
+ .shared_flag(false)
+ .static_flag(true)
+ .compile("foo");
+
+ test.cmd(0)
+ .must_have("-static")
+ .must_not_have("-shared");
+}
+
+#[test]
+fn msvc_smoke() {
+ let test = Test::msvc();
+ test.gcc()
+ .file("foo.c")
+ .compile("foo");
+
+ test.cmd(0)
+ .must_have("/O2")
+ .must_have("foo.c")
+ .must_not_have("/Z7")
+ .must_have("/c")
+ .must_have("/MD");
+ test.cmd(1).must_have(test.td.path().join("foo.o"));
+}
+
+#[test]
+fn msvc_opt_level_0() {
+ let test = Test::msvc();
+ test.gcc()
+ .opt_level(0)
+ .file("foo.c")
+ .compile("foo");
+
+ test.cmd(0).must_not_have("/O2");
+}
+
+#[test]
+fn msvc_debug() {
+ let test = Test::msvc();
+ test.gcc()
+ .debug(true)
+ .file("foo.c")
+ .compile("foo");
+ test.cmd(0).must_have("/Z7");
+}
+
+#[test]
+fn msvc_include() {
+ let test = Test::msvc();
+ test.gcc()
+ .include("foo/bar")
+ .file("foo.c")
+ .compile("foo");
+
+ test.cmd(0).must_have("/I").must_have("foo/bar");
+}
+
+#[test]
+fn msvc_define() {
+ let test = Test::msvc();
+ test.gcc()
+ .define("FOO", "bar")
+ .define("BAR", None)
+ .file("foo.c")
+ .compile("foo");
+
+ test.cmd(0).must_have("/DFOO=bar").must_have("/DBAR");
+}
+
+#[test]
+fn msvc_static_crt() {
+ let test = Test::msvc();
+ test.gcc()
+ .static_crt(true)
+ .file("foo.c")
+ .compile("foo");
+
+ test.cmd(0).must_have("/MT");
+}
+
+#[test]
+fn msvc_no_static_crt() {
+ let test = Test::msvc();
+ test.gcc()
+ .static_crt(false)
+ .file("foo.c")
+ .compile("foo");
+
+ test.cmd(0).must_have("/MD");
+}