- 浏览: 233793 次
- 性别:
- 来自: 昆明
文章分类
最新评论
-
beiyangshuishi:
确实挺幽默的,太能恶搞了。不过这也让我想起日本的一则广告宣纸的 ...
一对活宝—— MySQL & PostgreSQL -
ShiningRay:
稍微看了vcf的api,比wxwidgets要干净得多
VCF 库的搞笑提示 -
Colorful:
Wow, this is amazing.
D语言 struct constrcutor 的 bug -
oldrev:
楼下,当时的 TRAC 确实说是要 py 2.4 的
出色的开源项目管理软件——Redmine -
jusdao:
...Trac可以用python2.5啊,没有说必须用2.4的 ...
出色的开源项目管理软件——Redmine
一个模仿 Ruby Test::Unit 的 Quick & Dirty 单元测试框架,托 __traits 的福,看起来已经有那么点意思了。提取行号在目前还没法实现,估计等 macro 出来就能解决这个问题。
SVN里的最新版在下面的链接处:
dotmars.googlecode.com/svn/trunk/sandbox/2.0/test.d
D2.0 代码
运行结果
oldrev@ubuntu:~/work/dotmars/sandbox/2.0$ dmd2 -run test.d
Started...
Finished
Error: stest.MyTestCase.testOne
Exception raised
Failure: test.MyTestCase.testOne [test.MyTestCase]
A stupid assertion
Failure: test.MyTestCase2.testThree [test.MyTestCase2]
Yet another stupid assertion
7 tests, 9 assertions, 2 failures, 1 errors
Happy hacking!
SVN里的最新版在下面的链接处:
dotmars.googlecode.com/svn/trunk/sandbox/2.0/test.d
D2.0 代码
- /**
- A D 2.0 unit test framework inspired by Ruby's Unit::Test
- // Written in the D programming language 2.0
- Authors: Wei Li (oldrev@gmail.com)
- License: BSD
- Copyright: Copyright (C) 2007 by Wei Li.
- */
- import std.stdio;
- ////////////////////////////////////////////////////////////////////////////////
- struct Failure
- {
- string location;
- string message;
- string testName;
- }
- ////////////////////////////////////////////////////////////////////////////////
- struct Error
- {
- Exception exception;
- string testName;
- }
- ////////////////////////////////////////////////////////////////////////////////
- class TestResult
- {
- private Error[] m_errors;
- private Failure[] m_fails;
- private int m_runCount;
- private int m_assertionCount;
- private int m_testCount;
- const(Error)[] errors() {
- return m_errors;
- }
- const(Failure)[] failures() {
- return m_fails;
- }
- void addFailure(const string loc, const string msg, const string name)
- {
- Failure f;
- with(f) {
- location = loc;
- message = msg;
- testName = name;
- }
- m_fails ~= f;
- }
- void addError(Exception ex, const string name)
- {
- Error e;
- with(e) {
- exception = ex;
- testName = name;
- }
- m_errors ~= e;
- }
- void addAssertion() {
- m_assertionCount++;
- }
- void addTest() {
- m_testCount++;
- }
- void addRun() {
- m_runCount++;
- }
- bool hasPassed() {
- return m_errors.length == 0 && m_fails.length == 0;
- }
- int errorCount() {
- return cast(int)m_errors.length;
- }
- int failureCount() {
- return cast(int)m_fails.length;
- }
- int runCount() {
- return m_runCount;
- }
- int testCount() {
- return m_testCount;
- }
- int assertionCount() {
- return m_assertionCount;
- }
- }
- ////////////////////////////////////////////////////////////////////////////////
- abstract class TestBase
- {
- protected this() {
- }
- abstract void run(TestResult result);
- abstract const bool isRunning();
- }
- ////////////////////////////////////////////////////////////////////////////////
- abstract class TestCase(Subclass) : TestBase
- {
- alias typeof(this) SelfType;
- struct TestMethod
- {
- string name;
- void delegate() method;
- }
- public const string name = Subclass.classinfo.name;
- private TestResult m_result;
- private TestMethod[] m_methods;
- private size_t m_currentMethod;
- private bool m_isFailed;
- private bool m_running = false;
- this() {
- }
- private static const(string) ctfMakeString(T)()
- {
- string ret;
- foreach(str; __traits(allMembers, T)) {
- if(str[0..4] == "test")
- ret ~= `addTestMethod(TestMethod("` ~ str ~ `", &sc.` ~ str ~ `)); ` ~ "\n";
- }
- return ret;
- }
- private void initial(const Subclass sc) {
- mixin(ctfMakeString!(Subclass)());
- }
- void addTestMethod(TestMethod tm) {
- m_methods ~= tm;
- }
- static Subclass createChild() {
- auto o = new Subclass;
- o.initial(o);
- return o;
- }
- void setup() {}
- void teardown() {}
- override const bool isRunning() {
- return m_running;
- }
- override void run(TestResult result)
- {
- m_result = result;
- m_result.addRun();
- foreach(size_t i, TestMethod tm; m_methods)
- {
- m_isFailed = false;
- m_currentMethod = i;
- m_result.addTest();
- setup();
- m_running = true;
- try {
- tm.method();
- }
- catch(Exception ex) {
- m_result.addError(ex, currentMethodName);
- }
- finally {
- m_running = false;
- }
- teardown();
- }
- }
- const string currentMethodName() {
- return name ~ "." ~ m_methods[m_currentMethod].name;
- }
- private void addFailure(const string message = null)
- {
- if(!m_isFailed)
- {
- m_isFailed = true;
- m_result.addFailure(name, message, currentMethodName);
- }
- }
- //////////////////////////// Assertion Functions ///////////////////////////
- void assertTrue(bool x, const string message = null)
- {
- m_result.addAssertion();
- if(!x) {
- addFailure(message);
- }
- }
- void assertNull(T)(const T value, const string message = null)
- {
- m_result.addAssertion();
- if(value !is null) {
- addFailure(message);
- }
- }
- void assertNotNull(T)(const T value, const string message = null)
- {
- m_result.addAssertion();
- if(value is null) {
- addFailure(message);
- }
- }
- void assertEqual(T)(const T expected, const T actual, const string message = null)
- {
- m_result.addAssertion();
- if(expected != actual) {
- addFailure(message);
- }
- }
- void assertNotEqual(T)(const T expected, const T actual, const T delta, const string message = null)
- {
- m_result.addAssertion();
- if(expected == actual) {
- addFailure(message);
- }
- }
- void flunk(const string message = "Flunked")
- {
- m_result.addAssertion();
- addFailure(message);
- }
- }
- ////////////////////////////////////////////////////////////////////////////////
- class TestSuit(Subclass, Tests...) : TestBase
- {
- alias typeof(this) SelfType;
- public const string name = Subclass.classinfo.name;
- private TestBase[] m_tests;
- private bool m_running = false;
- this()
- {
- m_running = false;
- foreach(T; Tests)
- {
- T test = T.createChild();
- addTest(test);
- }
- }
- static Subclass createChild() {
- return new Subclass;
- }
- const(TestBase)[] tests() {
- return m_tests;
- }
- void addTest(TestBase tb)
- in {
- assert(tb !is null);
- }
- body {
- m_tests ~= tb;
- }
- const bool empty() {
- return Tests.length == 0;
- }
- override const bool isRunning() {
- return m_running;
- }
- override void run(TestResult result) {
- m_running = true;
- foreach(test; m_tests) {
- test.run(result);
- }
- m_running = false;
- }
- }
- static class ConsoleRunner
- {
- static void showFailures(TestResult tr)
- {
- foreach(fail; tr.failures)
- {
- writefln("Failure: %s [%s]", fail.testName, fail.location);
- writefln("%s", fail.message);
- writefln();
- }
- }
- static void showErrors(TestResult tr)
- {
- foreach(err; tr.errors)
- {
- writefln("Error: s", err.testName);
- writefln("%s", err.exception.msg);
- writefln();
- }
- }
- static void run(TestBase tb)
- {
- auto result = new TestResult;
- writefln("Started...");
- tb.run(result);
- writefln("Finished\n");
- showErrors(result);
- showFailures(result);
- writefln();
- writefln("%d tests, %d assertions, %d failures, %d errors",
- result.testCount, result.assertionCount, result.failureCount, result.errorCount);
- if(result.hasPassed)
- writefln("Everything is OK.");
- }
- }
- ////////////////////////////////////////////////////////////////////////////////
- class MyTestCase : TestCase!(MyTestCase)
- {
- void testOne() {
- assertTrue(false, "A stupid assertion");
- assertTrue(true);
- assertTrue(true);
- throw new Exception("Exception raised");
- }
- void testTwo() {
- assertTrue(true);
- }
- void testThree() {
- assertTrue(true);
- }
- }
- class MyTestCase2 : TestCase!(MyTestCase2)
- {
- void testOne() {
- assertTrue(true);
- }
- void testTwo() {
- assertTrue(true);
- }
- void testThree() {
- assertTrue(false, "Yet another stupid assertion");
- }
- }
- class MyTestCase3 : TestCase!(MyTestCase3)
- {
- void testMethod() {
- assertTrue(true);
- }
- }
- class MyTestSuit1: TestSuit!(MyTestSuit1, MyTestCase)
- {
- }
- class MyTestSuit2: TestSuit!(MyTestSuit2, MyTestCase2)
- {
- }
- class MyTestSuit3: TestSuit!(MyTestSuit3, MyTestSuit1, MyTestSuit2, MyTestCase3)
- {
- }
- void main()
- {
- auto ts = new MyTestSuit3;
- ConsoleRunner.run(ts);
- }
运行结果
Started...
Finished
Error: stest.MyTestCase.testOne
Exception raised
Failure: test.MyTestCase.testOne [test.MyTestCase]
A stupid assertion
Failure: test.MyTestCase2.testThree [test.MyTestCase2]
Yet another stupid assertion
7 tests, 9 assertions, 2 failures, 1 errors
Happy hacking!
评论
3 楼
xgene
2007-07-28
2 楼
oldrev
2007-07-28
1 楼
oldrev
2007-07-27
Ruby的文档太成问题了,Programming Ruby 也不是很清楚
发表评论
-
Tango 0.99.7 Dominik 今天放出
2008-07-25 12:16 1419详细的发布公告: http://www.dsource.org ... -
D新闻组里的天才代码
2008-03-30 21:26 3310超猛的代码,刚才逛新闻组刚看到的,随便记录一下。 出自: ... -
Ubuntu & D
2008-03-23 12:33 2430前几天 Ubuntu Linux 8.04 (Hardy) 刚 ... -
Dotmars.test 单元测试框架简介
2007-11-19 22:43 94D语言内置的 unittest关键字+assert 组成的单元 ... -
mixin 模拟多继承
2007-11-10 17:40 3714D1.0 代码 /** TupleMixin ... -
简单的 C to D 转换 Ruby 脚本
2007-10-24 22:06 4660今天晚上费了点脑筋写了一个简单的 C2D 转换脚本,大致实现了 ... -
D1.0代码模拟 __traits(hasMember, ...)
2007-10-08 23:12 5149通过1.0的代码完全模拟了 D 2.0 __traits(ha ... -
更好的C++——给C++使用者的D语言简介
2007-09-14 01:30 12312作为 C++ 狂热的粉丝, ... -
让D代码自己编译自己
2007-09-12 22:55 4803刚在 D语言的新闻组里看到了D模板&元编程顶尖高人 ... -
Dotmars 实例之:容器、迭代器与算法框架
2007-08-03 23:49 5717Dotmars 实例之:容器、迭代器与算法框架 这几天 Mr. ... -
D 2.0 Const/Final/Invariant 概念简介
2007-07-24 22:55 5467D 2.0 Const/Final/Invariant 概 ... -
DotMars 版 Hello World
2007-06-05 02:17 8232DotMars 已经具有初步的样子了,特别发帖庆祝。 Dot ... -
关联数组字面值+函数字面值=支持任意类型的 switch
2007-05-19 23:29 4560刚才写字符串格式化的由于要处理所有内置类型,而且只有 Type ... -
.Net/Java 风格格式化字符串
2007-05-18 22:51 3627基础类库的东西看起来容易做起来难,今天花时间实现了一点点 . ... -
修改版 juno.com.base
2007-04-20 00:28 4319dsource 上的 juno 是一个很不错的 Windows ... -
C#-like 的 DLL 封装
2007-04-16 23:19 4418一个类似 C# 的 DllImport 实现,用于“半”动态加 ... -
简单的D语言 VIM 缩写插件
2007-04-13 15:45 3503昨晚我写了一个非常简单的 VIM 的D语言缩写插件,希望能让用 ... -
双向链表模板类
2007-04-07 02:03 3066参考 STL 实现的 Quick & Dirty 双向 ... -
用Rant自动化D语言程序构建
2007-03-31 13:54 3264上回说到 Rank 这个 Ruby 世界最广泛使用的构建工具在 ... -
D语言通用 Rakefile
2007-03-31 00:21 2946在一个日文网站上发现的通用 Rakefile for GDCr ...
相关推荐
"带有 Dagger2、Espresso 2.0 和 mockito 的 Android 单元测试示例"说明了这个项目不仅涉及到Dagger2,还包含了 Espresso 2.0(用于UI测试)和 Mockito(用于模拟对象的单元测试框架)。因此,这个项目是一个综合性...
J#运行时环境(JSharp Runtime)包含了J#编译器和运行时支持,允许开发者编写、编译和执行J#代码。它还提供了对Java虚拟机(JVM)的部分兼容,但请注意,J#并不是完全与Java兼容的语言,因为它不支持一些Java的高级...
《C#和.NET 2.0 实战:平台、语言与框架》这本书由Patrick Smacchia撰写,由Paradoxal Press出版,详细介绍了C#语言和.NET 2.0平台的关键概念和技术细节。本书分为三个主要部分:第一部分介绍.NET 2.0平台,第二部分...
Objective-C 2.0 运行时系统是Apple开发的面向对象编程语言Objective-C的核心组成部分,它是Objective-C程序在执行时动态操作的基础。这个编程指南深入解析了Objective-C运行时系统的内部工作原理,帮助开发者更好地...
- **自动化测试:** 在自动化测试框架中,BeanShell 可用于生成和执行测试脚本。 - **配置和脚本化任务:** 在系统管理和运维中,它可以用来处理配置文件,执行定期任务等。 5. **源码学习价值** - **动态语言...
.NET 2.0支持两种多态形式:编译时多态(方法重载)和运行时多态(方法重写)。接口(Interface)和抽象类(Abstract Class)也是实现多态的重要工具。 书中的示例源码涵盖了这些关键概念的实际应用,包括: - 第...
反射在许多场景下都有应用,比如插件架构、配置驱动编程、单元测试等,它为.NET开发者提供了极大的灵活性。 通过Reflector.exe,开发者可以: 1. 查看类、接口、结构、枚举等类型的定义。 2. 分析方法体,了解其...
"MCP 70-536 .NET Framework2.0.pdf"可能是一份关于.NET Framework 2.0的认证考试复习资料,它可能涵盖了以上提到的所有知识点,以及更多关于.NET Framework 2.0的深入内容,如编程模型、XML Web服务、反射、调试和...
在.NET 2.0中,泛型是一个强大的特性,它允许开发者在编译时实现类型安全,同时不会牺牲性能或增加代码体积。简单来说,泛型是一种在类、接口、方法等中使用类型参数的技术。这些类型参数可以在使用时指定具体类型,...
"ShareSourceCLI2.0" 是一个开源项目,主要基于 C# 编写,与 .NET CLI (Common Language Infrastructure) 相关。CLI 是一种跨平台的编程环境,由ECMA-335标准定义,它为多种编程语言提供了一个统一的运行时环境,即...
ASP.NET 2.0 是微软在.NET Framework 2.0 上构建的Web应用程序开发框架,它显著提升了开发效率,减少了编写代码的行数,使开发者能更快速地构建动态网站。在 ASP.NET 2.0 中,针对数据操作进行了重大改进,特别是对...
- **性能优异**:Dapper避免了大量ORM框架中的额外开销,如动态代理和运行时反射,从而提供了接近原生数据库访问的性能。 - **类型安全**:通过使用`SqlMapper`类,Dapper可以确保参数和返回值与C#类型之间的类型...
.NET 2.0是微软开发的一个重要框架,它为开发者提供了构建各种类型的应用程序的工具和平台。这个框架包括了编程语言(如C#、VB.NET等)、ASP.NET(用于Web应用程序开发)、WinForms(用于桌面应用程序开发)等多个...
元数据是.NET框架实现反射的基础,通过元数据,可以在运行时动态地获取和操作类型信息。 4. **编译与反编译**:了解IL可以帮助开发者使用反编译工具(如ILDASM或JetBrains dotPeek)查看编译后的.NET程序,这在调试...
在Dagger2中,它通过编译时处理而非运行时反射来实现依赖关系的管理,从而提供更好的性能和安全性。 ### 1. Dagger2的基本概念 - **Component(组件)**: 是Dagger2中的核心概念,它定义了依赖注入的接口,包含了...
在C#中,泛型允许开发者定义可以使用任意类型的类、接口或方法,只需在定义时指定一个类型参数,如`<T>`,这样就可以在同一个代码框架下处理不同类型的对象,极大地增强了代码的通用性和效率。 #### 泛型机制详解 ...
- **代码框架**:包括初始化OpenGL ES环境、加载和编译着色器、设置顶点数据等步骤。 - **着色器加载与编译**:使用OpenGL ES 2.0提供的API来加载和编译着色器源代码。 - **渲染循环**:设置渲染状态,调用绘制命令...
9. **Chapter10**:可能涉及到高级话题,如反射、委托和事件、设计模式等,这些都是.NET框架中强大的工具和技术,有助于提高代码的灵活性和可维护性。 通过学习这本书的源代码,开发者不仅可以巩固理论知识,还能...
.NET框架是微软开发的一个软件开发平台,主要用于构建和运行基于Windows的应用程序。它包含了Common Language Runtime(CLR)和丰富的类库,提供了从数据库交互到网络通信等多种功能。本章将概述.NET框架的主要组件...