throwtheswitch / ceedling Goto Github PK
View Code? Open in Web Editor NEWRuby-based unit testing and build system for C projects
Home Page: http://throwtheswitch.org
License: Other
Ruby-based unit testing and build system for C projects
Home Page: http://throwtheswitch.org
License: Other
Ceedling seems to support running tests via invoking Ceedling rather than calling rake directly. However, Windows does not have an implementation for PTY included with Ruby (using V1.9.3 atm). A Google search shows that rubysl-pty (v1.0.0 for Ruby V1.9.3) may be a workaround, but Ruby informs me this gem is dependent on the Ruby Dev Kit, yet another frustrating step.
Calling rake to run tests still works, but with the changeover in documentation, this could cause issues with new users on Windows systems.
(I don't think this is the same as #55)
This works:
:paths:
:test:
- .
This doesn't:
:paths:
:test: .
Same thing with ".." or any other path containing them.
The full error is:
rake aborted!
NoMethodError: undefined method `flatten' for ".":String
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling/configurator.rb:327:in `eval_path_list'
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling/configurator.rb:217:in `block in eval_paths'
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling/configurator.rb:217:in `each_pair'
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling/configurator.rb:217:in `eval_paths'
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling/setupinator.rb:28:in `do_setup'
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling/rakefile.rb:46:in `<top (required)>'
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling.rb:66:in `load'
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling.rb:66:in `load_project'
<snip>/test/ceedling/rakefile.rb:3:in `<top (required)>'
(See full trace by running task with --trace)
I noticed that a :when_ptr: :compare_ptr directive added to a project.yml file didn't take effect until after a rake clobber
. Changing the project.yml should invalidate everything.
If the tests output bad utf8 data, the shell_result[:output] =~ TEST_STDOUT_STATISTICS_PATTERN
line will choke.
Not sure what the proper fix is, but I think either scrubbing stdout to remove bad byte sequences, or at least a more indicative error would be helpful.
I have a patch, but I can't seem to make a change to the repo without git trying to replace the line endings of every single file. Very confused.
Anyway:
In generator_helper.rb
sanitized_output = shell_result[:output].dup
sanitized_output.scrub!
and a similar change to unity_shell_result[:output]
in generator_test_results.rb
Original error:
rake aborted!
ArgumentError: invalid byte sequence in UTF-8
/src/vendor/ceedling/lib/ceedling/generator_helper.rb:21:in `=~'
/src/vendor/ceedling/lib/ceedling/generator_helper.rb:21:in `test_results_error_handler'
/src/vendor/ceedling/lib/ceedling/generator.rb:153:in `generate_test_results'
/src/vendor/ceedling/lib/ceedling/rules_tests.rake:42:in `block in <top (required)>'
/src/vendor/ceedling/lib/ceedling/task_invoker.rb:74:in `invoke_test_results'
/src/vendor/ceedling/lib/ceedling/test_invoker.rb:68:in `block in setup_and_invoke'
/src/vendor/ceedling/lib/ceedling/test_invoker.rb:32:in `each'
/src/vendor/ceedling/lib/ceedling/test_invoker.rb:32:in `setup_and_invoke'
/src/vendor/ceedling/lib/ceedling/rules_tests.rake:57:in `block (2 levels) in <top (required)>'
I don't know if this is Ceedling's or the YAML library's problem.
YAML allows usage of aliases: define something at one point, and then refer to it later in the same file:
:flags:
:test:
:common: &common_flags
- -g
:compile:
:*:
- *common_flags
- -Wall
:link:
:*:
- *common_flags
- -L/opt/local/lib/
This works, and I think is quite useful. But:
:flags:
:test:
:common: &common_flags
-
:compile:
...
So, both problems together mean that every time you change an item in the list you should check that the list stays either with ONLY an empty item, OR with some item and NO empty items. Which is prone to error if you tend to selectively comment out things in an existing long list of flags.
If this is some bug in Ceedling's handling of the output of the YAML parser, then it would be nice to have it fixed.
However, if this is rather a bug in the YAML parser, then sorry for the noise :)
If a test has an infinite loop, the suite won't stop. We need some way to trap this condition and fail the test suite if the test never halts.
The xml_test_report.rb plugin had a change in commit c14904f on May 7, 2011. This changed the failed tests output so that the open and close tags for each test no longer match.
Was this intentional? Is there a parser that makes sense of this? I saw no comment in that commit as to why it was changed.
Hi, I've poked around in the sourcecode to see how easy it would be to change defines from an array to a hash.
Reason to do this is:
:defines:
:common: &common_defines
:DEBUG:
:HZ: 20
:COMP: "( A > B )"
:FILE: '\"hed.h\"'
:release:
<<: *common_defines
-DDEBUG -DHZ=20 -DCOMP="( A > B)" -DFILE=\"hed.h\"
I would love to do the work, but I would also love to have some feedback, before i commit to much time to it.
:paths:
:test:
- +:test/**
- -:esp/test/support
:source:
- +:./
Complains with "ERROR: Config path [:paths][:source][''] does not exist on disk."
I moved project.yml into my main source directory (to keep everything in source control). It seems like the file path standardization doesn't handle "./" very well.
FilePathUtils.standardize seems to be the culprit
This was addressed in #76 but still doesn't work. On Windows we get the following:
$ ceedling
c:/Ruby22/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:120:in `require': cannot load such file
-- pty (LoadError)
from c:/Ruby22/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:120:in `require'
from c:/Ruby22/lib/ruby/gems/2.2.0/gems/ceedling-0.20.3/bin/ceedling:151:in `<top (required)>'
from c:/Ruby22/bin/ceedling:22:in `load'
from c:/Ruby22/bin/ceedling:22:in `<main>'
This is because the rescue
is looking for a StandardError
. When I change lines 167 and 183 to this:
rescue LoadError
Then the rescue
statements work, but even with popen4 (0.1.2)
installed, the following error still occurs:
$ ceedling
c:/Ruby22/lib/ruby/gems/2.2.0/gems/ceedling-0.20.3/bin/ceedling:184:in `rescue in rescue in <top (required)>':
Could Not Find PTY or POPEN4 gem. Install one or both like 'gem install pty' (RuntimeError)
from c:/Ruby22/lib/ruby/gems/2.2.0/gems/ceedling-0.20.3/bin/ceedling:169:in `rescue in <top (required)
>'
from c:/Ruby22/lib/ruby/gems/2.2.0/gems/ceedling-0.20.3/bin/ceedling:150:in `<top (required)>'
from c:/Ruby22/bin/ceedling:22:in `load'
from c:/Ruby22/bin/ceedling:22:in `<main>'
I have a couple of ideas about what I would like to improve in Ceedling, but I don't know whether those are things that would be accepted by the official developers, or whether I could scratch my particular itch while also indirectly advancing some larger goal.
So some "to-do" list could be a great synchronization tool.
Hi,
I have started using Ceedling for a few weeks and I found in the Unity documentation that it was possible to use parametrized tests which I think is an awesome feature. However, I have had a hard time making it work!
According my analysis of the ruby scripts the generator.rb will call the generate_test_runner method which calls two methods from Ceedling generator_test_runner.rb: find_test_cases and then generate. The generate method will create a UnityTestRunnerGenerator instance and then call the generate method of the UnityTestRunnerGenerator module. The problem is that this generate method takes as argument the output of the generator_test_runner.rb find_test_cases method which is pretty different from the UnityTestRunnerGenerator find_tests method which is thus never called and is the one dealing with the TEST_CASE macro parsing. Therefore parametrized tests are impossible to run with Ceedling as far as I understand, which is a shame as it is a cool feature.
What I don't understand is why the Ceedling generator_test_runner.rb find_test_cases method and the UnityTestRunnerGenerator find_tests method are so different.
I did a small modification that made it work and perhaps you might be interested in it:
In Ceedling generator_test_runner.rb:
def find_test_cases(test_file)
require 'generate_test_runner.rb'
@test_runner_generator ||= UnityTestRunnerGenerator.new( @configurator.get_runner_config )
return @test_runner_generator.find_tests(@file_wrapper.read(test_file))
end
I am quite new to Ruby, so I hope this can be an input for enabling this feature on Ceedling :) (or it is already possible to make it work in an easier way and I have missed something :( ).
Best regards,
Matthieu Tardivon
The docs say that setting this environment variable should change where Ceedling looks for the project.yml file. Doesn't seem to be working.
I'm opening this here since there's not a lot of action on the ceedling-gcov repo -- hopefully this isn't beating a dead horse too much.
In any case, the gcov plugin has been broken for a while, and in general has seen very little maintenance. I've been using it for a while (with a local patch for the current issue), and I have a vested interested in seeing it maintained -- code coverage is pretty important for my testing workflow.
I'd be willing to take on its maintenance, and to add a couple of features that I'd like to use (namely, the generation of output files so one can see which lines aren't getting coverage in a file).
Full disclosure, I'm primarily a C developer, and have only recently started learning Ruby in earnest. With that said, I'm very keen to get involved in the Ceedling project, since I've found it about the best embedded-C unit-testing project out there.
Hi,
I set up here ceedling + unity to use with microchip on linux. The issue is due the function (line 30)
raw_unity_lines = output_string.split(/\n|\r\n/)
doesn't work properly (I'm not sure, but I think we should search for \r (linux) or \r\n (windows). I changed it for
raw_unity_lines = output_string.split(/\r|\r\n/)
I now it's working.
Thank you
Trying to use the gcov plugin. No readme file as indicated in the documentation. No gcov data is generated. The message "Depreciated plugin style used in gcov. Use new directory structure!" is displayed. Is there a way to enable gcov?
...
Linking test_TBuffer.out...
Running test_TBuffer.out...
sh: line 1: 58227 Segmentation fault: 11 ../../../build/test/out/test_TBuffer.out 2>&1
ERROR: Test executable "test_TBuffer.out" failed.
> Produced no output to $stdout.
> And exited with status: [139] (count of failed tests).
> This is often a symptom of a bad memory access in source or test code.
rake aborted!
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling/generator_helper.rb:36:in `test_results_error_handler'
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling/generator.rb:153:in `generate_test_results'
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling/rules_tests.rake:42:in `block in <top (required)>'
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling/task_invoker.rb:74:in `invoke_test_results'
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling/test_invoker.rb:68:in `block in setup_and_invoke'
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling/test_invoker.rb:32:in `setup_and_invoke'
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling/tasks_tests.rake:8:in `block (2 levels) in <top (required)>'
Tasks: TOP => ../../../build/test/results/test_TBuffer.pass
(See full trace by running task with --trace)
--------------------
OVERALL TEST SUMMARY
--------------------
No tests executed.
At the point of failure, 5 tests had already run (I know because the test function failing is the last one I added). No results are gathered, and no hint appears on what test function has failed.
Furthermore, the Test Summary is wrong.
Make a new project with ceedling new
, then create a new test module containing more than one test routine. In any routine other than the first, put a printf either in the test fixture or the code under test. Sanity check will fail because the test count will not match.
Example test code:
#include <stdio.h>
#include "unity.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void test_a(void)
{
}
// Move this before test_a or remove the printf and ceedling doesn't fail its sanity check.
void test_b(void)
{
printf("hello\n");
}
Error message:
Test 'test_ceedling_error.c'
----------------------------
Generating runner for test_ceedling_error.c...
Compiling test_ceedling_error_runner.c...
Compiling test_ceedling_error.c...
Compiling unity.c...
Compiling cmock.c...
Linking test_ceedling_error.out...
Running test_ceedling_error.out...
ERROR: Internal sanity check for test fixture 'test_ceedling_error.out' finds that Unity's final test count (2) does not match Ceedling's summation of all test cases (1).
Possible causes:
1. Your test + source dereferenced a null pointer.
2. Your test + source indexed past the end of a buffer.
3. Your test + source committed a memory access violation.
4. Your test fixture produced an exit code of 0 despite execution ending prematurely.
Sanity check failures of test results are usually a symptom of interrupted test execution.
rake aborted!
.../ceedling_error/vendor/ceedling/lib/ceedling/generator_test_results_sanity_checker.rb:60:in `sanity_check_warning'
.../ceedling_error/vendor/ceedling/lib/ceedling/generator_test_results_sanity_checker.rb:41:in `verify'
.../ceedling_error/vendor/ceedling/lib/ceedling/generator_test_results.rb:49:in `process_and_write_results'
.../ceedling_error/vendor/ceedling/lib/ceedling/generator.rb:153:in `generate_test_results'
.../ceedling_error/vendor/ceedling/lib/ceedling/rules_tests.rake:41:in `block in <top (required)>'
.../ceedling_error/vendor/ceedling/lib/ceedling/task_invoker.rb:74:in `invoke_test_results'
.../ceedling_error/vendor/ceedling/lib/ceedling/test_invoker.rb:68:in `block in setup_and_invoke' .../ceedling_error/vendor/ceedling/lib/ceedling/test_invoker.rb:32:in `setup_and_invoke'
.../Code/ceedling_error/vendor/ceedling/lib/ceedling/tasks_tests.rake:8:in `block (2 levels) in <top (required)>'
Tasks: TOP => build/test/results/test_ceedling_error.pass
(See full trace by running task with --trace)
--------------------
OVERALL TEST SUMMARY
--------------------
No tests executed.
It looks like the stdout from the 2nd test's output is getting squished up next to the "PASS" string from Unity when ceedling is trying to interpret result
in generator.rb::Generator.generate_test_results
, as seen below when I inspect shell_result
:
shell result => {:output=>"\ntest_printf.c:15:test_a:PASShello\n\ntest_printf.c:21:test_b:PASS\n-----------------------\n2 Tests 0 Failures 0 Ignored\nOK\n", :exit_code=>0}
I've seen the same behavior on Mac OS X and mingw32. Here's my mingw32 version info:
$ gem list
*** LOCAL GEMS ***
bigdecimal (1.1.0)
ceedling (0.15.5, 0.15.4)
io-console (0.3)
json (1.5.5)
minitest (2.5.1)
rake (10.3.2)
rdoc (3.9.5)
thor (0.19.1)
$ ruby --version
ruby 1.9.3p545 (2014-02-24) [i386-mingw32]
I think ceedling should fail more gracefully than just "rake aborted! Don't know how to build task 'new' (see --tasks)".
Is there a way to conditionally set up the tools block so that when, for example, I'm on Windows, the tools are set up like below, and when on Linux OS, it just uses the defaults?
:tools:
:test_compiler:
:executable: /MinGW/bin/gcc.exe
:test_linker:
:executable: /MinGW/bin/gcc.exe
:test_file_preprocessor:
:executable: /MinGW/bin/gcc.exe
:test_includes_preprocessor:
:executable: /MinGW/bin/cpp.exe
:test_dependencies_generator:
:executable: /MinGW/bin/gcc.exe
With a project.yml
including:
:cmock:
:mock_prefix: mock_
and a header file residing in src/mock_something/foo.h
Ceedling will choke because the rake pattern for mock headers (/#{CMOCK_MOCK_PREFIX}.+#{'\\'+EXTENSION_SOURCE}$/
, in lib/ceedling/rules_cmock.rb
) matches the full file path.
This is admittedly something of a corner case, but one which Ceedling probably ought still to handle.
In the error
rake aborted!
NoMethodError: undefined method `flatten' for ".":String
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling/configurator.rb:327:in `eval_path_list'
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling/configurator.rb:217:in `block in eval_paths'
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling/configurator.rb:217:in `each_pair'
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling/configurator.rb:217:in `eval_paths'
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling/setupinator.rb:28:in `do_setup'
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling/rakefile.rb:46:in `<top (required)>'
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling.rb:66:in `load'
/Users/mija/.gem/ruby/2.0.0/gems/ceedling-0.20.3/lib/ceedling.rb:66:in `load_project'
<snip>/test/ceedling/rakefile.rb:3:in `<top (required)>'
(See full trace by running task with --trace)
It would be good if Ceedling said that the problem was found while parsing such-and-such variable, or the line in the yml file if possible.
Note that --trace doesn't help.
It looks like this issue was address in Unity and CMock, but the current version of Ceedling doesn't appear to be pulling those versions.
Unity Fix(9 months ago): https://github.com/ThrowTheSwitch/Unity/blob/master/auto/generate_test_runner.rb
CMock Fix(9 months ago): https://github.com/ThrowTheSwitch/CMock/blob/master/lib/cmock_generator.rb
Hello guys!
I'm trying to run my unit test directly from Eclipse.
I succesfully followed the following tutorial: http://throwtheswitch.squarespace.com/white-papers/using-eclipse-ide.html
It's great. I just need to double click on the target to run the tests and I can see the results on the Eclipse console.
What I'm trying to achive now is for Eclipse to understand the errors and warnings output by Ceedling/Unit and display them accordingly in the "Problems" tab.
I tried enabling the stdout_ide_tests_report plugin on my project.yml, but that didn't help.
Anyone knows how to perform this? I hope to keep using the default Eclipse error parser, cause I use this same project to run Lint.
Thank you.
This is accepted in the .yml:
:project:
:build_root:
- ../../../../build
However, ceedling only looks for build
in the current directory.
Would be nice to have tags in the git repository matching the version numbers of the Ceedling gem - to know when/why to update, how in sync is the documentation, etc.
This is a bit of an odd problem, and took a little tracking down.
If I have a test which begins like this (where "utils/source/library.c" exists, and the include path contains "utils/", "utils/source" and "utils/headers":
#include "unity.h"
#include "file_being_tested.h"
#include "utils/headers/library.h"
Ceedling will find and include "utils/library.h", but will not attempt to compile "utils/source/library.c". This will cause linking to fail.
If, however, the test begins like this:
#include "unity.h"
#include "file_being_tested.h"
#include "library.h"
Ceedling compiles "utils/source/library.c" as expected.
Do you have any idea why this might be? I had a quick dig through the code, and got the impression that Ceedling wasn't even attempting to find "library.c", but didn't get any further than that.
The README says to run this command:
bundle execute rake # Run all CMock library tests
However, I get this error message when I do it on my system:
Could not find command "execute".
I don't know what the command should be instead.
It may also be useful to mention that Ruby should be in your PATH
and the bundle
gem installed.
Might require some work with ThrowTheSwitch/Unity as well.
We should add some support for disabling tests (such as 'xit' from rspec) or selecting only a specific subset to run (like rspec's ability to run tests found on a specific line).
Suggested syntax for command line:
rake test:test_foo.c[80] # run the test on line 80
rake test:test_foo.c[80,200] # run test found from line 80 to line 200
rake test:test_foo.c[*somePattern*] # run all tests with names matching pattern
Suggested syntax for tests:
// Don't run tests that have a 'disable_' or 'x_' prefix in the name.
// Examples:
// void disable_[prefix]_testName(void);
// void x_[prefix]_testName(void);
// This test would run
void test_someName(void)
{
// ...
}
// This test would not run
void x_test_someOtherName(void)
{
// ...
}
// Neither would this one
void disable_test_someOtherName(void)
{
// ...
}
I am using Ceedling with MingGW GCC and I would like to tell GCC to use c99. Since gcc is already the default, I did not add any :tools:
section. So according to the documentation I added a :flags:
section in my project.yml:
:flags:
:test:
:compile:
:*:
- -std=c99
But I still get the GCC errors telling me I am not using c99 and running rake test:all --trace
reveals that the flags are not being appended to the commandline.
most people use git for version control, and just like rails new project
and bundler gem project
,
they generate a .gitignore file by default, It would be awesome! (sorry for my poor English...)
Hi,
We are currently using Ceedling with unity tests on real hardware. When running the test with rake test:all it works fine, we got the test running and collecting the tests by writing a wrapper and calling that wrapper from the :test_fixture: part of project.yml. The wrapper uploads the firmware to the hardware and collects the text output from the tests.
Is there a way to run the build of collected tests without running the :test_fixture: part of the project.yml?
When debugging tests in the debugger with single stepping and so on, I would like to build the .out-files automatically, but manually loading the into the target with our debugger software. How could I do that without making a custom :test_fixture: for this usecase?
Is there a way to select different :test_fixture: section in the project.yml-file based on environment variables or rake switches?
Installed the temp_sensor example.
Run rake release
FAIL.
I think it has to do with an update to LLVM. It kinda seems like it's trying to use the systems std include dirs even though we're passing the argument '-nostdinc' to the compiler. Haven't found a solution yet. Any ideas?
Here is the output:
DrSheldon:temp_sensor_new jordanschaenzle$ rake test:all
In file included from build/temp/_TestAdcConductor.c:5:
In file included from src/Types.h:4:
In file included from /usr/include/math.h:31:
In file included from /usr/include/Availability.h:148:
/usr/include/AvailabilityInternal.h:4098:10: error: #else without #if
#else
^
/usr/include/AvailabilityInternal.h:4158:10: error: unterminated conditional directive
#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_6
^
/usr/include/AvailabilityInternal.h:4131:10: error: unterminated conditional directive
#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_5
^
/usr/include/AvailabilityInternal.h:4108:10: error: unterminated conditional directive
#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_4
^
4 errors generated.
ERROR: Shell command failed.
Shell executed command:
'cpp -MM -MG -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_PREPROCESSOR -w -nostdinc "build/temp/_TestAdcConductor.c"'
Produced output:
_TestAdcConductor.o: build/temp/_TestAdcConductor.c unity.h @@@@unity.h
test/support/UnityHelper.h @@@@UnityHelper.h src/Types.h @@@@Types.h
src/AdcConductor.h @@@@AdcConductor.h MockAdcModel.h
@@@@MockAdcModel.h MockAdcHardware.h @@@@MockAdcHardware.h
And exited with status: [1].
rake aborted!
ShellExecutionException
/Users/jordanschaenzle/Dropbox/Projects/DemoProjects/temp_sensor_new/vendor/ceedling/lib/tool_executor.rb:71:in exec' /Users/jordanschaenzle/Dropbox/Projects/DemoProjects/temp_sensor_new/vendor/ceedling/lib/preprocessinator_includes_handler.rb:28:in
form_shallow_dependencies_rule'
/Users/jordanschaenzle/Dropbox/Projects/DemoProjects/temp_sensor_new/vendor/ceedling/lib/preprocessinator.rb:31:in preprocess_shallow_includes' /Users/jordanschaenzle/Dropbox/Projects/DemoProjects/temp_sensor_new/vendor/ceedling/lib/preprocessinator.rb:11:in
block in setup'
/Users/jordanschaenzle/Dropbox/Projects/DemoProjects/temp_sensor_new/vendor/ceedling/lib/preprocessinator_helper.rb:11:in call' /Users/jordanschaenzle/Dropbox/Projects/DemoProjects/temp_sensor_new/vendor/ceedling/lib/preprocessinator_helper.rb:11:in
preprocess_includes'
/Users/jordanschaenzle/Dropbox/Projects/DemoProjects/temp_sensor_new/vendor/ceedling/lib/preprocessinator.rb:17:in preprocess_test_and_invoke_test_mocks' /Users/jordanschaenzle/Dropbox/Projects/DemoProjects/temp_sensor_new/vendor/ceedling/lib/test_invoker.rb:42:in
block in setup_and_invoke'
/Users/jordanschaenzle/Dropbox/Projects/DemoProjects/temp_sensor_new/vendor/ceedling/lib/test_invoker.rb:32:in setup_and_invoke' /Users/jordanschaenzle/Dropbox/Projects/DemoProjects/temp_sensor_new/vendor/ceedling/lib/tasks_tests.rake:8:in
block (2 levels) in <top (required)>'
Tasks: TOP => test:all
(See full trace by running task with --trace)
I get this error message when parsing a specific test output:
test_logger.c:27:test_logger_set_level_trace:PASS
test_logger.c:35:test_logger_write_trace:PASS
test_logger.c:40:test_logger_write_error:PASS
test_logger.c:68:test_logger_log:FAIL: Expected 'main.c' Was 'test/logger/test_logger.c'. Function 'term_put_text' called with unexpected value for argument 'text'.
-----------------------
4 Tests 1 Failures 0 Ignored
FAIL
The complete trace is:
** Invoke test:logger (first_time)
** Invoke test/logger/test_logger.c (first_time, not_needed)
** Execute test:logger
** Invoke directories (first_time)
** Invoke build/test/mocks (first_time, not_needed)
** Invoke build/artifacts (first_time, not_needed)
** Invoke build/test (first_time, not_needed)
** Invoke build/release (first_time, not_needed)
** Invoke build/artifacts/test (first_time, not_needed)
** Invoke build/test/runners (first_time, not_needed)
** Invoke build/test/results (first_time, not_needed)
** Invoke build/test/out (first_time, not_needed)
** Invoke build/test/cache (first_time, not_needed)
** Invoke build/test/dependencies (first_time, not_needed)
** Invoke build/artifacts/release (first_time, not_needed)
** Invoke build/release/cache (first_time, not_needed)
** Invoke build/release/out (first_time, not_needed)
** Invoke build/release/out/asm (first_time, not_needed)
** Invoke build/release/out/c (first_time, not_needed)
** Invoke build/release/dependencies (first_time, not_needed)
** Invoke build/logs (first_time, not_needed)
** Invoke build/temp (first_time, not_needed)
** Invoke build/test/preprocess/includes (first_time, not_needed)
** Invoke build/test/preprocess/files (first_time, not_needed)
** Execute directories
Test 'test_logger.c'
--------------------
** Invoke build/test/preprocess/includes/tmr.h (first_time, not_needed)
** Invoke src/misc/tmr.h (first_time, not_needed)
** Invoke build/test/preprocess/includes/terminal.h (first_time, not_needed)
** Invoke src/terminal/terminal.h (first_time, not_needed)
** Invoke build/test/mocks/mock_tmr.c (first_time, not_needed)
** Invoke build/test/cache/tmr.h (first_time, not_needed)
** Invoke /Users/willem/Dropbox/Development/stage/smartline/vendor/ceedling/vendor/cmock/release/build.info (first_time, not_needed)
** Invoke build/test/mocks/mock_terminal.c (first_time, not_needed)
** Invoke build/test/cache/terminal.h (first_time, not_needed)
** Invoke /Users/willem/Dropbox/Development/stage/smartline/vendor/ceedling/vendor/cmock/release/build.info (not_needed)
** Invoke build/test/preprocess/includes/test_logger.c (first_time, not_needed)
** Invoke test/logger/test_logger.c (not_needed)
** Invoke build/test/runners/test_logger_runner.c (first_time, not_needed)
** Invoke build/test/cache/test_logger.c (first_time, not_needed)
** Invoke build/test/results/test_logger.pass (first_time)
** Invoke build/test/out/test_logger.out (first_time)
** Invoke build/test/out/test_logger_runner.o (first_time, not_needed)
** Invoke build/test/runners/test_logger_runner.c (not_needed)
** Invoke build/test/out/test_logger.o (first_time, not_needed)
** Invoke test/logger/test_logger.c (not_needed)
** Invoke build/test/out/mock_tmr.o (first_time, not_needed)
** Invoke build/test/mocks/mock_tmr.c (not_needed)
** Invoke build/test/out/mock_terminal.o (first_time, not_needed)
** Invoke build/test/mocks/mock_terminal.c (not_needed)
** Invoke build/test/out/unity.o (first_time, not_needed)
** Invoke /Users/willem/Dropbox/Development/stage/smartline/vendor/ceedling/vendor/unity/src/unity.c (first_time, not_needed)
** Invoke /Users/willem/Dropbox/Development/stage/smartline/vendor/ceedling/vendor/unity/src/unity.h (first_time, not_needed)
** Invoke /Users/willem/Dropbox/Development/stage/smartline/vendor/ceedling/vendor/unity/src/unity_internals.h (first_time, not_needed)
** Invoke build/test/out/logger.o (first_time, not_needed)
** Invoke src/logger/logger.c (first_time, not_needed)
** Invoke build/test/out/cmock.o (first_time, not_needed)
** Invoke /Users/willem/Dropbox/Development/stage/smartline/vendor/ceedling/vendor/cmock/src/cmock.c (first_time, not_needed)
** Invoke /Users/willem/Dropbox/Development/stage/smartline/vendor/ceedling/vendor/cmock/src/cmock.h (first_time, not_needed)
** Execute build/test/out/test_logger.out
Linking test_logger.out...
** Execute build/test/results/test_logger.pass
Running test_logger.out...
Picked up JAVA_TOOL_OPTIONS: -Djava.awt.headless=true
rake aborted!
undefined method `join' for nil:NilClass
/Users/willem/Dropbox/Development/stage/smartline/vendor/ceedling/lib/ceedling/generator_test_results.rb:83:in `extract_line_elements'
/Users/willem/Dropbox/Development/stage/smartline/vendor/ceedling/lib/ceedling/generator_test_results.rb:41:in `block in process_and_write_results'
/Users/willem/Dropbox/Development/stage/smartline/vendor/ceedling/lib/ceedling/generator_test_results.rb:29:in `lines'
/Users/willem/Dropbox/Development/stage/smartline/vendor/ceedling/lib/ceedling/generator_test_results.rb:29:in `process_and_write_results'
/Users/willem/Dropbox/Development/stage/smartline/vendor/ceedling/lib/ceedling/generator.rb:154:in `generate_test_results'
/Users/willem/Dropbox/Development/stage/smartline/vendor/ceedling/lib/ceedling/rules_tests.rake:41:in `block in <top (required)>'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/task.rb:226:in `call'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/task.rb:226:in `block in execute'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/task.rb:223:in `each'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/task.rb:223:in `execute'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/task.rb:166:in `block in invoke_with_call_chain'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/task.rb:159:in `invoke_with_call_chain'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/task.rb:152:in `invoke'
/Users/willem/Dropbox/Development/stage/smartline/vendor/ceedling/lib/ceedling/task_invoker.rb:74:in `invoke_test_results'
/Users/willem/Dropbox/Development/stage/smartline/vendor/ceedling/lib/ceedling/test_invoker.rb:68:in `block in setup_and_invoke'
/Users/willem/Dropbox/Development/stage/smartline/vendor/ceedling/lib/ceedling/test_invoker.rb:32:in `each'
/Users/willem/Dropbox/Development/stage/smartline/vendor/ceedling/lib/ceedling/test_invoker.rb:32:in `setup_and_invoke'
/Users/willem/Dropbox/Development/stage/smartline/vendor/ceedling/lib/ceedling/rules_tests.rake:56:in `block (2 levels) in <top (required)>'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/task.rb:226:in `call'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/task.rb:226:in `block in execute'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/task.rb:223:in `each'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/task.rb:223:in `execute'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/task.rb:166:in `block in invoke_with_call_chain'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/task.rb:159:in `invoke_with_call_chain'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/task.rb:152:in `invoke'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/application.rb:143:in `invoke_task'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/application.rb:101:in `block (2 levels) in top_level'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/application.rb:101:in `each'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/application.rb:101:in `block in top_level'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/application.rb:110:in `run_with_threads'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/application.rb:95:in `top_level'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/application.rb:73:in `block in run'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/application.rb:160:in `standard_exception_handling'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rake/application.rb:70:in `run'
/usr/bin/rake:37:in `<main>'
Tasks: TOP => build/test/results/test_logger.pass
--------------------
OVERALL TEST SUMMARY
--------------------
No tests executed.
I updated from version 0.13.0
, which was working fine, to 0.15.6
. I am using Mingw32 under Windows. I did the following in a path containing a space (c:/Project Xtreme/
):
> ceedling new PcControl
> cd PcControl
> rake module:create[Dummy]
> rake test:all
The last command dumped the following error:
Test 'test_Dummy.c'
-------------------
gcc.exe: error: Xtreme/PcControl/vendor/ceedling/vendor/unity/src: No such file
or directory
gcc.exe: error: Xtreme/PcControl/vendor/ceedling/vendor/cmock/src: No such file
or directory
ERROR: Shell command failed.
> Shell executed command:
'gcc.exe -E -MM -MG -Itest -Itest/support -Isrc -Ic:/Project Xtreme/PcControl/ve
ndor/ceedling/vendor/unity/src -Ic:/Project Xtreme/PcControl/vendor/ceedling/ven
dor/cmock/src -Ibuild/test/mocks -DTEST -DTEST -DGNU_COMPILER -w "build/temp/_te
st_Dummy.c"'
> And exited with status: [1].
rake aborted!
ShellExecutionException
c:/Project Xtreme/PcControl/vendor/ceedling/lib/ceedling/tool_executor.rb:74:in
`exec'
c:/Project Xtreme/PcControl/vendor/ceedling/lib/ceedling/preprocessinator_includ
es_handler.rb:39:in `form_shallow_dependencies_rule'
c:/Project Xtreme/PcControl/vendor/ceedling/lib/ceedling/preprocessinator.rb:31:
in `preprocess_shallow_includes'
c:/Project Xtreme/PcControl/vendor/ceedling/lib/ceedling/preprocessinator.rb:11:
in `block in setup'
c:/Project Xtreme/PcControl/vendor/ceedling/lib/ceedling/preprocessinator_helper
.rb:11:in `call'
c:/Project Xtreme/PcControl/vendor/ceedling/lib/ceedling/preprocessinator_helper
.rb:11:in `preprocess_includes'
c:/Project Xtreme/PcControl/vendor/ceedling/lib/ceedling/preprocessinator.rb:17:
in `preprocess_test_and_invoke_test_mocks'
c:/Project Xtreme/PcControl/vendor/ceedling/lib/ceedling/test_invoker.rb:42:in `
block in setup_and_invoke'
c:/Project Xtreme/PcControl/vendor/ceedling/lib/ceedling/test_invoker.rb:32:in `
setup_and_invoke'
c:/Project Xtreme/PcControl/vendor/ceedling/lib/ceedling/tasks_tests.rake:8:in `
block (2 levels) in <top (required)>'
Tasks: TOP => test:all
(See full trace by running task with --trace)
--------------------
OVERALL TEST SUMMARY
--------------------
No tests executed.
I works fine with path without space, though.
I enabled Ceedling's Bullseye plugin and I ran:
rake bullseye:all
It emits a warning:
WARNING: Depreciated plugin style used in bullseye. Use new directory structure!
and an error:
ERROR: Tool 'bullseye_linker' cannot expand nonexistent value 'PLUGINS_BULLSEYE_LIB_PATH' for substitution string '-L$'.
rake aborted!
I grepped through the source and found that the only reference to PLUGINS_BULLSEYE_LIB_PATH is in plugins/bullseye/defaults.yml. How is the constant supposed to get defined?
From reading the forums, it looked like ThrowTheSwitch was using Bullseye for code coverage analysis. Have you generated any documentation on how to use Bullseye with Ceedling? The Ceedling documentation says to look at the readme.txt file in the Bullseye directory but it is empty.
BTW, note that your warning message has deprecated incorrectly spelled.
There is a small bug in the module creation framework, the message that the module is deleted is shown on stdout but the file isn't removed. The command File.delete(file[:path]) after line 67 in the file module_generator.rb solves this issue.
When building a release, Ceedling puts all of my object files into a single folder, regardless of where they came from under my source folder. I'd like the object files to be in a tree that matches the source folder tree.
I think I could do this if I could manipulate the ${1} parameter when defining [:tools:][:release_compiler:][:arguments:], and use it to generate the object file path to match the source file path.
I haven't quite figured out how use ${1} as an argument in some Ruby-ish text manipulation. Is this possible?
Hi,
I am trying to get Ceedling/Unity tests to work on Cortex M4 hardware. The “use_test_preprocessor” was set to True in project.yml file. I got the following error without adding “test_includes_preprocessor” and “test_file_preprocessor” to the project.yml file. It looks like IAR predefined macros such as IAR_SYSTEM_ICC are not defined using gcc for preprocessing (gcc by default if “test_file_preprocessor” is not configured). “test_compiler” and “test_linker” were configured to IAR compiler/linker (iccarm/ilinkarm)
Do I have to configure “test_includes_preprocessor” and “test_file_preprocessor” for target build?
I got a different error of ‘cannot open source file “@@@@unity.h”’ if “test_includes_preprocessor” and “test_file_preprocessor” were configured. The unity.h is included in the test file and is located on one of the searched path. Why was the file name changed to @@@@unity.h? Is this a temporary file of unity.h?
It could be I didn’t configure “test_includes_preprocessor” and “test_file_preprocessor” correctly as follows:
:test_includes_preprocessor:
:executable: iccarm
:arguments:
- -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
- -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
- -D$: COLLECTION_DEFINES_TEST_AND_VENDOR
- -D$: DEFINES_TEST_PREPROCESS
- -DUNITY_EXCLUDE_STDINT_H
- '"${1}"'
:test_file_preprocessor:
:executable: iccarm
:arguments:
- -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
- -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
- -D$: COLLECTION_DEFINES_TEST_AND_VENDOR
- -D$: DEFINES_TEST_PREPROCESS
- -DUNITY_EXCLUDE_STDINT_H
- '"${1}"'
- -o "${2}"
I hope someone can point me to the right direction. Any input is greatly appreciated!
I found a bug when using use_deep_dependencies.
Hi Guys,
the documentation says:
release_dependencies_generator:
Discovers deep dependencies of source files (for incremental builds)
${1}: input source file
${2}: compiled object filepath
${3}: output dependencies file
But during linking with my custom tools configuration, my linker said unknown format.
I checked generator.rb @ line 31:
def generate_dependencies_file(tool, context, source, object, dependencies)
@streaminator.stdout_puts("Generating dependencies for #{File.basename(source)}...", Verbosity::NORMAL)
command =
@tool_executor.build_command_line(
tool,
source,
dependencies,
object)
@tool_executor.exec( command[:line], command[:options] )
end
Seems like ${2} is the dependencies file and ${3} object file.
I tried it that way, and it worked.
Greetings,
Edgar
Installed the temp_sensor example.
Run rake release
FAIL.
I think it has to do with an update to LLVM. It kinda seems like it's trying to use the systems std include dirs even though we're passing the argument '-nostdinc' to the compiler. Haven't found a solution yet. Any ideas?
Here is the output:
DrSheldon:temp_sensor_new jordanschaenzle$ rake test:all
In file included from build/temp/_TestAdcConductor.c:5:
In file included from src/Types.h:4:
In file included from /usr/include/math.h:31:
In file included from /usr/include/Availability.h:148:
/usr/include/AvailabilityInternal.h:4098:10: error: #else without #if
#else
^
/usr/include/AvailabilityInternal.h:4158:10: error: unterminated conditional directive
#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_6
^
/usr/include/AvailabilityInternal.h:4131:10: error: unterminated conditional directive
#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_5
^
/usr/include/AvailabilityInternal.h:4108:10: error: unterminated conditional directive
#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_4
^
4 errors generated.
ERROR: Shell command failed.
Shell executed command:
'cpp -MM -MG -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_PREPROCESSOR -w -nostdinc "build/temp/_TestAdcConductor.c"'
Produced output:
_TestAdcConductor.o: build/temp/_TestAdcConductor.c unity.h @@@@unity.h
test/support/UnityHelper.h @@@@UnityHelper.h src/Types.h @@@@Types.h
src/AdcConductor.h @@@@AdcConductor.h MockAdcModel.h
@@@@MockAdcModel.h MockAdcHardware.h @@@@MockAdcHardware.h
And exited with status: [1].
rake aborted!
ShellExecutionException
/Users/jordanschaenzle/Dropbox/Projects/DemoProjects/temp_sensor_new/vendor/ceedling/lib/tool_executor.rb:71:in exec' /Users/jordanschaenzle/Dropbox/Projects/DemoProjects/temp_sensor_new/vendor/ceedling/lib/preprocessinator_includes_handler.rb:28:in
form_shallow_dependencies_rule'
/Users/jordanschaenzle/Dropbox/Projects/DemoProjects/temp_sensor_new/vendor/ceedling/lib/preprocessinator.rb:31:in preprocess_shallow_includes' /Users/jordanschaenzle/Dropbox/Projects/DemoProjects/temp_sensor_new/vendor/ceedling/lib/preprocessinator.rb:11:in
block in setup'
/Users/jordanschaenzle/Dropbox/Projects/DemoProjects/temp_sensor_new/vendor/ceedling/lib/preprocessinator_helper.rb:11:in call' /Users/jordanschaenzle/Dropbox/Projects/DemoProjects/temp_sensor_new/vendor/ceedling/lib/preprocessinator_helper.rb:11:in
preprocess_includes'
/Users/jordanschaenzle/Dropbox/Projects/DemoProjects/temp_sensor_new/vendor/ceedling/lib/preprocessinator.rb:17:in preprocess_test_and_invoke_test_mocks' /Users/jordanschaenzle/Dropbox/Projects/DemoProjects/temp_sensor_new/vendor/ceedling/lib/test_invoker.rb:42:in
block in setup_and_invoke'
/Users/jordanschaenzle/Dropbox/Projects/DemoProjects/temp_sensor_new/vendor/ceedling/lib/test_invoker.rb:32:in setup_and_invoke' /Users/jordanschaenzle/Dropbox/Projects/DemoProjects/temp_sensor_new/vendor/ceedling/lib/tasks_tests.rake:8:in
block (2 levels) in <top (required)>'
Tasks: TOP => test:all
(See full trace by running task with --trace)
By design, Ceedling only processes files included directly from within a test_...c file. These files are annotated with @@@@
by a preprocessor rule and then included.
However, this makes sharing code between tests impossible. In my case for example, I would like to include a custom mock in multiple tests.
A solution to this would be to preprocess and include any file residing in
:paths:
:test:
- test/test/**
, and apply the rule mentioned above to files in :source:
.
Any ideas on how to achieve this?
I've modified preprocessinator_includes_handler.rb::extract_shallow_includes(make_rule)
to include headers both annotated with @@@@
and beginning with mock_
, but this doesn't cut the mustard.
I am running 'all' tests within a folder using the following command: rake test:path[object_properties_default]
When tests are completed, the 'Overall Unit Test Summary' displays:
Tested: 328
Passed: 285
Failed: 7
Ignored: 36
But if I rerun the tests the summary is:
Tested: 129
Passed: 105
Failed: 7
Ignored: 17
I need to run rake clean in order to run all the tests again. Why is this? I would expect every test to be repeatable without necessitating a clean.
Any help appreciated.
Regards,
Paul
Once you go through a full Ceedling run (compilation + test run), if a test subsequently fails to compile, Ceedling will still run the now-outdated test binary - and so will report test results as if nothing had happened.
So, to be sure that the tests that get run are actually the existing tests, clobber is pretty much mandatory.
I'd suggest that if an error is detected on compilation, at the very least some noise should be made, and maybe trigger a clobber if it is not possible to specificaly remove the now-outdated test.
If you run rake Bullseye:all and a test fails during the run, the task does not return an error. If you echo %ERRORLEVEL% is prints out 0. I tried to find the bug but I got lost.
How does one go about adding all paths under the CWD as a source path? It's not that there are source files in the CWD, but rather that #include paths are specified relative to the CWD.
I've tried:
:path:
:source:
- ./**
- **
- . # -I"." gets specified, but no paths under the CWD
Thanks!
The docs claim that Ceedling will evaluate and substitute #{...}
in values in project.yml
. However, no such substitution appears to be occurring.
In lib/configurator.rb
, the method eval_environment_variables
is declared. This appears to do roughly what is needed, EXCEPT for the fact that it applies only to :environment
, and not to any other keys (I need substitution in :tools
).
Is this something which should be fixed? I'm happy to supply a patch.
Thanks
Hello. Ceedling is awesome project and we use this system everyday.
I appreciate all of your hard effort :)
By the way, we did a customize to specify test-specific definition to compile the test.
Though it was tentatively realized by following pull-request but I think it is a kind of dirty hack.
I also wrote what we want to do in the comment of the pull-request.
Does anyone have an idea to make it possible properly?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.