summaryrefslogtreecommitdiffstats
path: root/tinyusb/test/vendor/ceedling/plugins/fake_function_framework/spec
diff options
context:
space:
mode:
Diffstat (limited to 'tinyusb/test/vendor/ceedling/plugins/fake_function_framework/spec')
-rwxr-xr-xtinyusb/test/vendor/ceedling/plugins/fake_function_framework/spec/fff_mock_header_generator_spec.rb304
-rwxr-xr-xtinyusb/test/vendor/ceedling/plugins/fake_function_framework/spec/fff_mock_source_generator_spec.rb149
-rwxr-xr-xtinyusb/test/vendor/ceedling/plugins/fake_function_framework/spec/header_generator.rb51
-rwxr-xr-xtinyusb/test/vendor/ceedling/plugins/fake_function_framework/spec/spec_helper.rb96
4 files changed, 600 insertions, 0 deletions
diff --git a/tinyusb/test/vendor/ceedling/plugins/fake_function_framework/spec/fff_mock_header_generator_spec.rb b/tinyusb/test/vendor/ceedling/plugins/fake_function_framework/spec/fff_mock_header_generator_spec.rb
new file mode 100755
index 00000000..e6ac11dd
--- /dev/null
+++ b/tinyusb/test/vendor/ceedling/plugins/fake_function_framework/spec/fff_mock_header_generator_spec.rb
@@ -0,0 +1,304 @@
+require 'stringio'
+require 'fff_mock_generator.rb'
+require 'header_generator.rb'
+
+# Test the contents of the .h file created for the mock.
+describe "FffMockGenerator.create_mock_header" do
+
+ context "when there is nothing to mock," do
+ let(:mock_header) {
+ parsed_header = {}
+ FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
+ }
+ it "then the generated header file starts with an opening include guard" do
+ expect(mock_header).to start_with(
+ "#ifndef mock_display_H\n" +
+ "#define mock_display_H")
+ end
+ it "then the generated file ends with a closing include guard" do
+ expect(mock_header).to end_with(
+ "#endif // mock_display_H\n")
+ end
+ it "then the generated file includes the fff header" do
+ expect(mock_header).to include(
+ %{#include "fff.h"\n})
+ end
+ it "then the generated file has a prototype for the init function" do
+ expect(mock_header).to include(
+ "void mock_display_Init(void);")
+ end
+ it "then the generated file has a prototype for the verify function" do
+ expect(mock_header).to include(
+ "void mock_display_Verify(void);")
+ end
+ it "then the generated file has a prototype for the destroy function" do
+ expect(mock_header).to include(
+ "void mock_display_Destroy(void);")
+ end
+ end
+
+ context "when there is a function with no args and a void return," do
+ let(:mock_header) {
+ parsed_header = create_cmock_style_parsed_header(
+ [{:name => 'display_turnOffStatusLed', :return_type => 'void'}])
+ FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
+ }
+ it "then the generated header file starts with an opening include guard" do
+ expect(mock_header).to start_with(
+ "#ifndef mock_display_H\n" +
+ "#define mock_display_H")
+ end
+ it "then the generated header file contains a fake function declaration" do
+ expect(mock_header).to include(
+ "DECLARE_FAKE_VOID_FUNC0(display_turnOffStatusLed);"
+ )
+ end
+ it "then the generated file ends with a closing include guard" do
+ expect(mock_header).to end_with(
+ "#endif // mock_display_H\n")
+ end
+ end
+
+ context "when there is a function with no args and a bool return," do
+ let(:mock_header) {
+ parsed_header = create_cmock_style_parsed_header(
+ [{:name => 'display_isError', :return_type => 'bool'}])
+ FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
+ }
+ it "then the generated file contains the fake function declaration" do
+ expect(mock_header).to include(
+ "DECLARE_FAKE_VALUE_FUNC0(bool, display_isError);"
+ )
+ end
+ end
+
+ context "when there is a function with no args and an int return," do
+ let(:mock_header) {
+ parsed_header = create_cmock_style_parsed_header(
+ [{:name => 'display_isError', :return_type => 'int'}])
+ FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
+ }
+ it "then the generated file contains the fake function declaration" do
+ expect(mock_header).to include(
+ "DECLARE_FAKE_VALUE_FUNC0(int, display_isError);"
+ )
+ end
+ end
+
+ context "when there is a function with args and a void return," do
+ let(:mock_header) {
+ parsed_header = create_cmock_style_parsed_header(
+ [{:name => 'display_setVolume', :return_type => 'void', :args => ['int']}])
+ FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
+ }
+ it "then the generated file contains the fake function declaration" do
+ expect(mock_header).to include(
+ "DECLARE_FAKE_VOID_FUNC1(display_setVolume, int);"
+ )
+ end
+ end
+
+ context "when there is a function with args and a value return," do
+ let(:mock_header) {
+ parsed_header = create_cmock_style_parsed_header(
+ [{:name => 'a_function', :return_type => 'int', :args => ['char *']}])
+ FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
+ }
+ it "then the generated file contains the fake function declaration" do
+ expect(mock_header).to include(
+ "FAKE_VALUE_FUNC1(int, a_function, char *);"
+ )
+ end
+ end
+
+ context "when there is a function with many args and a void return," do
+ let(:mock_header) {
+ parsed_header = create_cmock_style_parsed_header(
+ [{:name => 'a_function', :return_type => 'void',
+ :args => ['int', 'char *', 'int', 'int', 'bool', 'applesauce']}])
+ FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
+ }
+ it "then the generated file contains the fake function declaration" do
+ expect(mock_header).to include(
+ "DECLARE_FAKE_VOID_FUNC6(a_function, int, char *, int, int, bool, applesauce);"
+ )
+ end
+ end
+
+ context "when there are multiple functions," do
+ let(:mock_header) {
+ parsed_header = create_cmock_style_parsed_header(
+ [ {:name => 'a_function', :return_type => 'int', :args => ['char *']},
+ {:name => 'another_function', :return_type => 'void'},
+ {:name => 'three', :return_type => 'bool', :args => ['float', 'int']}
+ ])
+ FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
+ }
+ it "then the generated file contains the first fake function declaration" do
+ expect(mock_header).to include(
+ "DECLARE_FAKE_VALUE_FUNC1(int, a_function, char *);"
+ )
+ end
+ it "then the generated file contains the second fake function declaration" do
+ expect(mock_header).to include(
+ "DECLARE_FAKE_VOID_FUNC0(another_function);"
+ )
+ end
+ it "then the generated file contains the third fake function declaration" do
+ expect(mock_header).to include(
+ "DECLARE_FAKE_VALUE_FUNC2(bool, three, float, int);"
+ )
+ end
+ end
+
+ context "when there is a typedef," do
+ let(:mock_header) {
+ parsed_header = create_cmock_style_parsed_header(
+ nil, ["typedef void (*displayCompleteCallback) (void);"])
+ FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
+ }
+ it "then the generated file contains the typedef" do
+ expect(mock_header).to include(
+ "typedef void (*displayCompleteCallback) (void);"
+ )
+ end
+ end
+
+ context "when there is a void function with variable arguments" do
+ let(:mock_header){
+ parsed_header = {}
+ parsed_header[:functions] = [{
+ :name => "function_with_var_args",
+ :return => {:type => "void"},
+ :var_arg => "...",
+ :args => [{:type => 'char *'}]
+ }]
+ FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
+ }
+ it "then the generated file contains the vararg declaration" do
+ expect(mock_header).to include(
+ "DECLARE_FAKE_VOID_FUNC2_VARARG(function_with_var_args, char *, ...)"
+ )
+ end
+ end
+
+ context "when there is a function with a return value and variable arguments" do
+ let(:mock_header){
+ parsed_header = {}
+ parsed_header[:functions] = [{
+ :name => "function_with_var_args",
+ :return => {:type => "int"},
+ :var_arg => "...",
+ :args => [{:type => 'char *'}]
+ }]
+ FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
+ }
+ it "then the generated file contains the vararg declaration" do
+ expect(mock_header).to include(
+ "DECLARE_FAKE_VALUE_FUNC2_VARARG(int, function_with_var_args, char *, ...)"
+ )
+ end
+ end
+
+ context "when there is a void function with variable arguments and " +
+ "additional arguments" do
+ let(:mock_header){
+ parsed_header = {}
+ parsed_header[:functions] = [{
+ :name => "function_with_var_args",
+ :return => {:type => "void"},
+ :var_arg => "...",
+ :args => [{:type => 'char *'}, {:type => 'int'}]
+ }]
+ FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
+ }
+ it "then the generated file contains the vararg declaration" do
+ expect(mock_header).to include(
+ "DECLARE_FAKE_VOID_FUNC3_VARARG(function_with_var_args, char *, int, ...)"
+ )
+ end
+ end
+
+ context "when there is a function with a pointer to a const value" do
+ let(:mock_header){
+ parsed_header = {}
+ parsed_header[:functions] = [{
+ :name => "const_test_function",
+ :return => {:type => "void"},
+ :args => [{:type => "char *", :name => "a", :ptr? => false, :const? => true},
+ {:type => "char *", :name => "b", :ptr? => false, :const? => false}]
+ }]
+ FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
+ }
+ it "then the generated file contains the correct const argument in the declaration" do
+ expect(mock_header).to include(
+ "DECLARE_FAKE_VOID_FUNC2(const_test_function, const char *, char *)"
+ )
+ end
+ end
+
+ context "when there is a function that returns a const pointer" do
+ let(:mock_header){
+ parsed_header = {}
+ parsed_header[:functions] = [{
+ :name => "return_const_pointer_test_function",
+ :modifier => "const",
+ :return => {:type => "char *" },
+ :args => [{:type => "int", :name => "a"}]
+ }]
+ FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
+ }
+ it "then the generated file contains the correct const return value in the declaration" do
+ expect(mock_header).to include(
+ "DECLARE_FAKE_VALUE_FUNC1(const char *, return_const_pointer_test_function, int)"
+ )
+ end
+ end
+
+ context "when there is a function that returns a const int" do
+ let(:mock_header){
+ parsed_header = {}
+ parsed_header[:functions] = [{
+ :name => "return_const_int_test_function",
+ :modifier => "const",
+ :return => {:type => "int" },
+ :args => []
+ }]
+ FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
+ }
+ it "then the generated file contains the correct const return value in the declaration" do
+ expect(mock_header).to include(
+ "DECLARE_FAKE_VALUE_FUNC0(const int, return_const_int_test_function)"
+ )
+ end
+ end
+
+ context "when there are pre-includes" do
+ let(:mock_header) {
+ parsed_header = {}
+ FffMockGenerator.create_mock_header("display", "mock_display", parsed_header,
+ [%{"another_header.h"}])
+ }
+ it "then they are included before the other files" do
+ expect(mock_header).to include(
+ %{#include "another_header.h"\n} +
+ %{#include "fff.h"}
+ )
+ end
+ end
+
+ context "when there are post-includes" do
+ let(:mock_header) {
+ parsed_header = {}
+ FffMockGenerator.create_mock_header("display", "mock_display", parsed_header,
+ nil, [%{"another_header.h"}])
+ }
+ it "then they are included after the other files" do
+ expect(mock_header).to include(
+ %{#include "display.h"\n} +
+ %{#include "another_header.h"\n}
+ )
+ end
+ end
+
+end
diff --git a/tinyusb/test/vendor/ceedling/plugins/fake_function_framework/spec/fff_mock_source_generator_spec.rb b/tinyusb/test/vendor/ceedling/plugins/fake_function_framework/spec/fff_mock_source_generator_spec.rb
new file mode 100755
index 00000000..364f8521
--- /dev/null
+++ b/tinyusb/test/vendor/ceedling/plugins/fake_function_framework/spec/fff_mock_source_generator_spec.rb
@@ -0,0 +1,149 @@
+require 'stringio'
+require 'fff_mock_generator.rb'
+
+# Test the contents of the .c file created for the mock.
+describe "FffMockGenerator.create_mock_source" do
+
+ context "when there is nothing to mock," do
+ let(:mock_source) {
+ parsed_header = {}
+ FffMockGenerator.create_mock_source("mock_my_module", parsed_header)
+ }
+ it "then the generated file includes the fff header" do
+ expect(mock_source).to include(
+ # fff.h also requires including string.h
+ %{#include <string.h>\n} +
+ %{#include "fff.h"}
+ )
+ end
+ it "then the generated file includes the mock header" do
+ expect(mock_source).to include(
+ %{#include "mock_my_module.h"\n}
+ )
+ end
+ it "then the generated file defines the init function" do
+ expect(mock_source).to include(
+ "void mock_my_module_Init(void)\n" +
+ "{\n" +
+ " FFF_RESET_HISTORY();\n" +
+ "}"
+ )
+ end
+ it "then the generated file defines the verify function" do
+ expect(mock_source).to include(
+ "void mock_my_module_Verify(void)\n" +
+ "{\n" +
+ "}"
+ )
+ end
+ it "then the generated file defines the destroy function" do
+ expect(mock_source).to include(
+ "void mock_my_module_Destroy(void)\n" +
+ "{\n" +
+ "}"
+ )
+ end
+ end
+
+ context "when there are multiple functions," do
+ let(:mock_source) {
+ parsed_header = create_cmock_style_parsed_header(
+ [ {:name => 'a_function', :return_type => 'int', :args => ['char *']},
+ {:name => 'another_function', :return_type => 'void'},
+ {:name => 'three', :return_type => 'bool', :args => ['float', 'int']}
+ ])
+ FffMockGenerator.create_mock_source("mock_display", parsed_header)
+ }
+ it "then the generated file contains the first fake function definition" do
+ expect(mock_source).to include(
+ "DEFINE_FAKE_VALUE_FUNC1(int, a_function, char *);"
+ )
+ end
+ it "then the generated file contains the second fake function definition" do
+ expect(mock_source).to include(
+ "DEFINE_FAKE_VOID_FUNC0(another_function);"
+ )
+ end
+ it "then the generated file contains the third fake function definition" do
+ expect(mock_source).to include(
+ "DEFINE_FAKE_VALUE_FUNC2(bool, three, float, int);"
+ )
+ end
+ it "then the init function resets all of the fakes" do
+ expect(mock_source).to include(
+ "void mock_display_Init(void)\n" +
+ "{\n" +
+ " FFF_RESET_HISTORY();\n" +
+ " RESET_FAKE(a_function)\n" +
+ " RESET_FAKE(another_function)\n" +
+ " RESET_FAKE(three)\n" +
+ "}"
+ )
+ end
+ end
+
+ context "when there is a void function with variable arguments and " +
+ "additional arguments" do
+ let(:mock_source){
+ parsed_header = {}
+ parsed_header[:functions] = [{
+ :name => "function_with_var_args",
+ :return => {:type => "void"},
+ :var_arg => "...",
+ :args => [{:type => 'char *'}, {:type => 'int'}]
+ }]
+ FffMockGenerator.create_mock_source("mock_display", parsed_header)
+ }
+ it "then the generated file contains the vararg definition" do
+ expect(mock_source).to include(
+ "DEFINE_FAKE_VOID_FUNC3_VARARG(function_with_var_args, char *, int, ...)"
+ )
+ end
+ end
+
+ context "when there is a function with a pointer to a const value" do
+ let(:mock_source){
+ parsed_header = {}
+ parsed_header[:functions] = [{
+ :name => "const_test_function",
+ :return => {:type => "void"},
+ :args => [{:type => "char *", :name => "a", :ptr? => false, :const? => true},
+ {:type => "char *", :name => "b", :ptr? => false, :const? => false}]
+ }]
+ FffMockGenerator.create_mock_source("mock_display", parsed_header)
+ }
+ it "then the generated file contains the correct const argument in the declaration" do
+ expect(mock_source).to include(
+ "DEFINE_FAKE_VOID_FUNC2(const_test_function, const char *, char *)"
+ )
+ end
+ end
+
+ context "when there are pre-includes" do
+ let(:mock_source) {
+ parsed_source = {}
+ FffMockGenerator.create_mock_source("mock_display", parsed_source,
+ [%{"another_header.h"}])
+ }
+ it "then they are included before the other files" do
+ expect(mock_source).to include(
+ %{#include "another_header.h"\n} +
+ %{#include <string.h>}
+ )
+ end
+ end
+
+ context "when there are post-includes" do
+ let(:mock_source) {
+ parsed_source = {}
+ FffMockGenerator.create_mock_source("mock_display", parsed_source,
+ nil, [%{"another_header.h"}])
+ }
+ it "then they are included before the other files" do
+ expect(mock_source).to include(
+ %{#include "mock_display.h"\n} +
+ %{#include "another_header.h"\n}
+ )
+ end
+ end
+end \ No newline at end of file
diff --git a/tinyusb/test/vendor/ceedling/plugins/fake_function_framework/spec/header_generator.rb b/tinyusb/test/vendor/ceedling/plugins/fake_function_framework/spec/header_generator.rb
new file mode 100755
index 00000000..cda27844
--- /dev/null
+++ b/tinyusb/test/vendor/ceedling/plugins/fake_function_framework/spec/header_generator.rb
@@ -0,0 +1,51 @@
+# Create a CMock-style parsed header hash. This the type of hash created by
+# CMock when parsing header files for automock generation. It contains all of
+# includes, typedefs and functions (with return types and arguments) parsed from
+# the header file.
+def create_cmock_style_parsed_header(functions, typedefs = nil)
+ parsed_header = {
+ :includes => nil,
+ :functions => [],
+ :typedefs => []
+ }
+
+ # Add the typedefs.
+ if typedefs
+ typedefs.each do |typedef|
+ parsed_header[:typedefs] << typedef
+ end
+ end
+
+ # Add the functions.
+ if functions
+ functions.each do |function|
+ # Build the array of arguments.
+ args = []
+ if function.key?(:args)
+ function[:args].each do |arg|
+ args << {
+ :type => arg
+ }
+ end
+ end
+ parsed_header[:functions] << {
+ :name => function[:name],
+ :modifier => "",
+ :return => {
+ :type => function[:return_type],
+ :name => "cmock_to_return",
+ :ptr? => false,
+ :const? => false,
+ :str => "void cmock_to_return",
+ :void? => true
+ },
+ :var_arg => nil,
+ :args_string => "void",
+ :args => args,
+ :args_call => "",
+ :contains_ptr? => false
+ }
+ end
+ end
+ parsed_header
+end \ No newline at end of file
diff --git a/tinyusb/test/vendor/ceedling/plugins/fake_function_framework/spec/spec_helper.rb b/tinyusb/test/vendor/ceedling/plugins/fake_function_framework/spec/spec_helper.rb
new file mode 100755
index 00000000..25dc80ac
--- /dev/null
+++ b/tinyusb/test/vendor/ceedling/plugins/fake_function_framework/spec/spec_helper.rb
@@ -0,0 +1,96 @@
+# This file was generated by the `rspec --init` command. Conventionally, all
+# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
+# The generated `.rspec` file contains `--require spec_helper` which will cause
+# this file to always be loaded, without a need to explicitly require it in any
+# files.
+#
+# Given that it is always loaded, you are encouraged to keep this file as
+# light-weight as possible. Requiring heavyweight dependencies from this file
+# will add to the boot time of your test suite on EVERY test run, even for an
+# individual file that may not need all of that loaded. Instead, consider making
+# a separate helper file that requires the additional dependencies and performs
+# the additional setup, and require it from the spec files that actually need
+# it.
+#
+# The `.rspec` file also contains a few flags that are not defaults but that
+# users commonly want.
+#
+# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
+RSpec.configure do |config|
+ # rspec-expectations config goes here. You can use an alternate
+ # assertion/expectation library such as wrong or the stdlib/minitest
+ # assertions if you prefer.
+ config.expect_with :rspec do |expectations|
+ # This option will default to `true` in RSpec 4. It makes the `description`
+ # and `failure_message` of custom matchers include text for helper methods
+ # defined using `chain`, e.g.:
+ # be_bigger_than(2).and_smaller_than(4).description
+ # # => "be bigger than 2 and smaller than 4"
+ # ...rather than:
+ # # => "be bigger than 2"
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
+ end
+
+ # rspec-mocks config goes here. You can use an alternate test double
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
+ config.mock_with :rspec do |mocks|
+ # Prevents you from mocking or stubbing a method that does not exist on
+ # a real object. This is generally recommended, and will default to
+ # `true` in RSpec 4.
+ mocks.verify_partial_doubles = true
+ end
+
+# The settings below are suggested to provide a good initial experience
+# with RSpec, but feel free to customize to your heart's content.
+=begin
+ # These two settings work together to allow you to limit a spec run
+ # to individual examples or groups you care about by tagging them with
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
+ # get run.
+ config.filter_run :focus
+ config.run_all_when_everything_filtered = true
+
+ # Allows RSpec to persist some state between runs in order to support
+ # the `--only-failures` and `--next-failure` CLI options. We recommend
+ # you configure your source control system to ignore this file.
+ config.example_status_persistence_file_path = "spec/examples.txt"
+
+ # Limits the available syntax to the non-monkey patched syntax that is
+ # recommended. For more details, see:
+ # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
+ # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
+ # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
+ config.disable_monkey_patching!
+
+ # This setting enables warnings. It's recommended, but in some cases may
+ # be too noisy due to issues in dependencies.
+ config.warnings = true
+
+ # Many RSpec users commonly either run the entire suite or an individual
+ # file, and it's useful to allow more verbose output when running an
+ # individual spec file.
+ if config.files_to_run.one?
+ # Use the documentation formatter for detailed output,
+ # unless a formatter has already been configured
+ # (e.g. via a command-line flag).
+ config.default_formatter = 'doc'
+ end
+
+ # Print the 10 slowest examples and example groups at the
+ # end of the spec run, to help surface which specs are running
+ # particularly slow.
+ config.profile_examples = 10
+
+ # Run specs in random order to surface order dependencies. If you find an
+ # order dependency and want to debug it, you can fix the order by providing
+ # the seed, which is printed after each run.
+ # --seed 1234
+ config.order = :random
+
+ # Seed global randomization in this process using the `--seed` CLI option.
+ # Setting this allows you to use `--seed` to deterministically reproduce
+ # test failures related to randomization by passing the same `--seed` value
+ # as the one that triggered the failure.
+ Kernel.srand config.seed
+=end
+end