cppyabm  1.0.17
An agent-based library to integrate C++ and Python
test_setuphelper.py
Go to the documentation of this file.
1 # -*- coding: utf-8 -*-
2 import os
3 import sys
4 import subprocess
5 from textwrap import dedent
6 
7 import pytest
8 
9 DIR = os.path.abspath(os.path.dirname(__file__))
10 MAIN_DIR = os.path.dirname(os.path.dirname(DIR))
11 
12 
13 @pytest.mark.parametrize("parallel", [False, True])
14 @pytest.mark.parametrize("std", [11, 0])
15 def test_simple_setup_py(monkeypatch, tmpdir, parallel, std):
16  monkeypatch.chdir(tmpdir)
17  monkeypatch.syspath_prepend(MAIN_DIR)
18 
19  (tmpdir / "setup.py").write_text(
20  dedent(
21  u"""\
22  import sys
23  sys.path.append({MAIN_DIR!r})
24 
25  from setuptools import setup, Extension
26  from pybind11.setup_helpers import build_ext, Pybind11Extension
27 
28  std = {std}
29 
30  ext_modules = [
31  Pybind11Extension(
32  "simple_setup",
33  sorted(["main.cpp"]),
34  cxx_std=std,
35  ),
36  ]
37 
38  cmdclass = dict()
39  if std == 0:
40  cmdclass["build_ext"] = build_ext
41 
42 
43  parallel = {parallel}
44  if parallel:
45  from pybind11.setup_helpers import ParallelCompile
46  ParallelCompile().install()
47 
48  setup(
49  name="simple_setup_package",
50  cmdclass=cmdclass,
51  ext_modules=ext_modules,
52  )
53  """
54  ).format(MAIN_DIR=MAIN_DIR, std=std, parallel=parallel),
55  encoding="ascii",
56  )
57 
58  (tmpdir / "main.cpp").write_text(
59  dedent(
60  u"""\
61  #include <pybind11/pybind11.h>
62 
63  int f(int x) {
64  return x * 3;
65  }
66  PYBIND11_MODULE(simple_setup, m) {
67  m.def("f", &f);
68  }
69  """
70  ),
71  encoding="ascii",
72  )
73 
74  subprocess.check_call(
75  [sys.executable, "setup.py", "build_ext", "--inplace"],
76  stdout=sys.stdout,
77  stderr=sys.stderr,
78  )
79 
80  # Debug helper printout, normally hidden
81  for item in tmpdir.listdir():
82  print(item.basename)
83 
84  assert (
85  len([f for f in tmpdir.listdir() if f.basename.startswith("simple_setup")]) == 1
86  )
87  assert len(list(tmpdir.listdir())) == 4 # two files + output + build_dir
88 
89  (tmpdir / "test.py").write_text(
90  dedent(
91  u"""\
92  import simple_setup
93  assert simple_setup.f(3) == 9
94  """
95  ),
96  encoding="ascii",
97  )
98 
99  subprocess.check_call(
100  [sys.executable, "test.py"], stdout=sys.stdout, stderr=sys.stderr
101  )
list
Definition: pytypes.h:1345
len
size_t len(handle h)
Get the length of a Python object.
Definition: pytypes.h:1560
print
PYBIND11_NOINLINE void print(tuple args, dict kwargs)
Definition: pybind11.h:2056
test_setuphelper.test_simple_setup_py
def test_simple_setup_py(monkeypatch, tmpdir, parallel, std)
Definition: test_setuphelper.py:15