move ceedling tests to test/unit-test

This commit is contained in:
hathach
2022-12-08 09:59:02 +07:00
parent 4b50ca2a61
commit be4f4e4f79
213 changed files with 1 additions and 1 deletions

View File

@@ -0,0 +1,119 @@
ceedling-module-generator
=========================
## Overview
The module_generator plugin adds a pair of new commands to Ceedling, allowing
you to make or remove modules according to predefined templates. WIth a single call,
Ceedling can generate a source, header, and test file for a new module. If given a
pattern, it can even create a series of submodules to support specific design patterns.
Finally, it can just as easily remove related modules, avoiding the need to delete
each individually.
Let's say, for example, that you want to create a single module named `MadScience`.
```
ceedling module:create[MadScience]
```
It says we're speaking to the module plugin, and we want to create a new module. The
name of that module is between the brackets. It will keep this case, unless you have
specified a different default (see configuration). It will create three files:
`MadScience.c`, `MadScience.h`, and `TestMadScience.c`. *NOTE* that it is important that
there are no spaces between the brackets. We know, it's annoying... but it's the rules.
You can also create an entire pattern of files. To do that, just add a second argument
to the pattern ID. Something like this:
```
ceedling module:create[SecretLair,mch]
```
In this example, we'd create 9 files total: 3 headers, 3 source files, and 3 test files. These
files would be named `SecretLairModel`, `SecretLairConductor`, and `SecretLairHardware`. Isn't
that nice?
Similarly, you can create stubs for all functions in a header file just by making a single call
to your handy `stub` feature, like this:
```
ceedling module:stub[SecretLair]
```
This call will look in SecretLair.h and will generate a file SecretLair.c that contains a stub
for each function declared in the header! Even better, if SecretLair.c already exists, it will
add only new functions, leaving your existing calls alone so that it doesn't cause any problems.
## Configuration
Enable the plugin in your project.yml by adding `module_generator`
to the list of enabled plugins.
Then, like much of Ceedling, you can just run as-is with the defaults, or you can override those
defaults for your own needs. For example, new source and header files will be automatically
placed in the `src/` folder while tests will go in the `test/` folder. That's great if your project
follows the default ceedling structure... but what if you have a different structure?
```
:module_generator:
:project_root: ./
:source_root: source/
:inc_root: includes/
:test_root: tests/
```
Now I've redirected the location where modules are going to be generated.
### Includes
You can make it so that all of your files are generated with a standard include list. This is done
by adding to the `:includes` array. For example:
```
:module_generator:
:includes:
:tst:
- defs.h
- board.h
:src:
- board.h
```
### Boilerplates
You can specify the actual boilerplate used for each of your files. This is the handy place to
put that corporate copyright notice (or maybe a copyleft notice, if that's your perference?)
```
:module_generator:
:boilerplates: |
/***************************
* This file is Awesome. *
* That is All. *
***************************/
```
### Test Defines
You can specify the "#ifdef TEST" at the top of the test files with a custom define.
This example will put a "#ifdef CEEDLING_TEST" at the top of the test files.
```
:module_generator:
:test_define: CEEDLING_TEST
```
### Naming Convention
Finally, you can force a particular naming convention. Even if someone calls the generator
with something like `MyNewModule`, if they have the naming convention set to `:caps`, it will
generate files like `MY_NEW_MODULE.c`. This keeps everyone on your team behaving the same way.
Your options are as follows:
- `:bumpy` - BumpyFilesLooksLikeSo
- `:camel` - camelFilesAreSimilarButStartLow
- `:snake` - snake_case_is_all_lower_and_uses_underscores
- `:caps` - CAPS_FEELS_LIKE_YOU_ARE_SCREAMING

View File

@@ -0,0 +1,4 @@
:module_generator:
:project_root: ./
:source_root: src/
:test_root: test/

View File

@@ -0,0 +1,80 @@
require 'ceedling/plugin'
require 'ceedling/constants'
require 'erb'
require 'fileutils'
class ModuleGenerator < Plugin
attr_reader :config
def create(module_name, optz={})
require "generate_module.rb" #From Unity Scripts
if ((!optz.nil?) && (optz[:destroy]))
UnityModuleGenerator.new( divine_options(optz) ).destroy(module_name)
else
UnityModuleGenerator.new( divine_options(optz) ).generate(module_name)
end
end
def stub_from_header(module_name, optz={})
require "cmock.rb" #From CMock
stuboptz = divine_options(optz)
pathname = optz[:path_inc] || optz[:path_src] || "src"
filename = File.expand_path(optz[:module_root_path], File.join(pathname, module_name + ".h"))
CMock.new(stuboptz).setup_skeletons(filename)
end
private
def divine_options(optz={})
unity_generator_options =
{
:path_src => ((defined? MODULE_GENERATOR_SOURCE_ROOT ) ? MODULE_GENERATOR_SOURCE_ROOT.gsub('\\', '/').sub(/^\//, '').sub(/\/$/, '') : "src" ),
:path_inc => ((defined? MODULE_GENERATOR_INC_ROOT ) ?
MODULE_GENERATOR_INC_ROOT.gsub('\\', '/').sub(/^\//, '').sub(/\/$/, '')
: (defined? MODULE_GENERATOR_SOURCE_ROOT ) ?
MODULE_GENERATOR_SOURCE_ROOT.gsub('\\', '/').sub(/^\//, '').sub(/\/$/, '')
: "src" ),
:path_tst => ((defined? MODULE_GENERATOR_TEST_ROOT ) ? MODULE_GENERATOR_TEST_ROOT.gsub( '\\', '/').sub(/^\//, '').sub(/\/$/, '') : "test" ),
:pattern => optz[:pattern],
:test_prefix => ((defined? PROJECT_TEST_FILE_PREFIX ) ? PROJECT_TEST_FILE_PREFIX : "Test" ),
:mock_prefix => ((defined? CMOCK_MOCK_PREFIX ) ? CMOCK_MOCK_PREFIX : "Mock" ),
:includes => ((defined? MODULE_GENERATOR_INCLUDES ) ? MODULE_GENERATOR_INCLUDES : {} ),
:boilerplates => ((defined? MODULE_GENERATOR_BOILERPLATES) ? MODULE_GENERATOR_BOILERPLATES : {} ),
:naming => ((defined? MODULE_GENERATOR_NAMING ) ? MODULE_GENERATOR_NAMING : nil ),
:update_svn => ((defined? MODULE_GENERATOR_UPDATE_SVN ) ? MODULE_GENERATOR_UPDATE_SVN : false ),
:skeleton_path=> ((defined? MODULE_GENERATOR_SOURCE_ROOT ) ? MODULE_GENERATOR_SOURCE_ROOT.gsub('\\', '/').sub(/^\//, '').sub(/\/$/, '') : "src" ),
:test_define => ((defined? MODULE_GENERATOR_TEST_DEFINE ) ? MODULE_GENERATOR_TEST_DEFINE : "TEST" ),
}
# Read Boilerplate template file.
if (defined? MODULE_GENERATOR_BOILERPLATE_FILES)
bf = MODULE_GENERATOR_BOILERPLATE_FILES
if !bf[:src].nil? && File.exists?(bf[:src])
unity_generator_options[:boilerplates][:src] = File.read(bf[:src])
end
if !bf[:inc].nil? && File.exists?(bf[:inc])
unity_generator_options[:boilerplates][:inc] = File.read(bf[:inc])
end
if !bf[:tst].nil? && File.exists?(bf[:tst])
unity_generator_options[:boilerplates][:tst] = File.read(bf[:tst])
end
end
# If using "create[<module_root>:<module_name>]" option from command line.
unless optz[:module_root_path].to_s.empty?
unity_generator_options[:path_src] = File.join(optz[:module_root_path], unity_generator_options[:path_src])
unity_generator_options[:path_inc] = File.join(optz[:module_root_path], unity_generator_options[:path_inc])
unity_generator_options[:path_tst] = File.join(optz[:module_root_path], unity_generator_options[:path_tst])
end
return unity_generator_options
end
end

View File

@@ -0,0 +1,62 @@
namespace :module do
module_root_separator = ":"
desc "Generate module (source, header and test files)"
task :create, :module_path do |t, args|
files = [args[:module_path]] + (args.extras || [])
optz = { :module_root_path => "" }
["dh", "dih", "mch", "mvp", "src", "test"].each do |pat|
p = files.delete(pat)
optz[:pattern] = p unless p.nil?
end
files.each do |v|
module_root_path, module_name = v.split(module_root_separator, 2)
if module_name
optz[:module_root_path] = module_root_path
v = module_name
end
if (v =~ /^test_?/i)
# If the name of the file starts with test, automatically treat it as one
@ceedling[:module_generator].create(v.sub(/^test_?/i,''), optz.merge({:pattern => 'test'}))
else
# Otherwise, go through the normal procedure
@ceedling[:module_generator].create(v, optz)
end
end
end
desc "Generate module stubs from header"
task :stub, :module_path do |t, args|
files = [args[:module_path]] + (args.extras || [])
optz = { :module_root_path => "" }
files.each do |v|
module_root_path, module_name = v.split(module_root_separator, 2)
if module_name
optz[:module_root_path] = module_root_path
v = module_name
end
# Otherwise, go through the normal procedure
@ceedling[:module_generator].stub_from_header(v, optz)
end
end
desc "Destroy module (source, header and test files)"
task :destroy, :module_path do |t, args|
files = [args[:module_path]] + (args.extras || [])
optz = { :destroy => true, :module_root_path => "" }
["dh", "dih", "mch", "mvp", "src", "test"].each do |pat|
p = files.delete(pat)
optz[:pattern] = p unless p.nil?
end
files.each do |v|
module_root_path, module_name = v.split(module_root_separator, 2)
if module_name
optz[:module_root_path] = module_root_path
v = module_name
end
@ceedling[:module_generator].create(v, optz)
end
end
end