Created
November 6, 2009 06:27
-
-
Save stesla/227775 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/Rakefile b/Rakefile | |
index 3ab2592..96c8c83 100644 | |
--- a/Rakefile | |
+++ b/Rakefile | |
@@ -49,7 +49,7 @@ Rake::GemPackageTask.new(gemspec) do |pkg| | |
end | |
namespace :test do | |
- Rake::TestTask.new :all => [:extension] do |t| | |
+ Rake::TestTask.new :all => [:test_extension] do |t| | |
t.libs << 'test' | |
t.libs << 'ext' | |
t.pattern = 'test/**/*_test.rb' | |
@@ -59,12 +59,19 @@ namespace :test do | |
end | |
task :extension => "ext/base32.bundle" | |
+task :test_extension do | |
+ sh 'rake TEST=1 ext/base32.bundle' | |
+end | |
extension_source = FileList["ext/**/*.c", "ext/**/*.h"] | |
file "ext/base32.bundle" => ["ext/Makefile", *extension_source] do | |
cd "ext" do | |
- sh "make" | |
+ if ENV['TEST'] | |
+ sh "make cflags=\"-D TEST\"" | |
+ else | |
+ sh "make" | |
+ end | |
end | |
end | |
diff --git a/ext/decoder.c b/ext/decoder.c | |
index c234451..24628d4 100644 | |
--- a/ext/decoder.c | |
+++ b/ext/decoder.c | |
@@ -53,7 +53,7 @@ base32_decode_buffer_size (const size_t encodedTextLength) | |
{ | |
if (encodedTextLength == 0 || encodedTextLength % 8 != 0) | |
return 0; | |
- return encodedTextLength * 8 / 5; | |
+ return encodedTextLength * 5 / 8; | |
} | |
size_t | |
diff --git a/ext/ext.c b/ext/ext.c | |
index c038add..46015e2 100644 | |
--- a/ext/ext.c | |
+++ b/ext/ext.c | |
@@ -39,6 +39,9 @@ b32_decode (VALUE self, VALUE value) | |
return value; | |
VALUE result = rb_str_new (0, base32_decode_buffer_size (RSTRING (value)->len)); | |
+#ifdef TEST | |
+ memset(RSTRING (result)->ptr, 0xff, RSTRING (result)->len); | |
+#endif | |
size_t length = base32_decode ((uint8_t *) RSTRING (result)->ptr, RSTRING (result)->len, | |
(uint8_t *) RSTRING (value)->ptr, RSTRING (value)->len); | |
if (length == 0) | |
@@ -60,17 +63,36 @@ b32_encode (VALUE self, VALUE value) | |
value = StringValue(value); | |
VALUE result = rb_str_new (0, base32_encoder_buffer_size (RSTRING (value)->len)); | |
+#ifdef TEST | |
+ memset(RSTRING (result)->ptr, 0xff, RSTRING (result)->len); | |
+#endif | |
base32_encode ((uint8_t *) RSTRING (result)->ptr, RSTRING (result)->len, | |
(uint8_t *) RSTRING (value)->ptr, RSTRING (value)->len); | |
return result; | |
} | |
+#ifdef TEST | |
+static VALUE | |
+b32_test_strlen (VALUE self, VALUE value) | |
+{ | |
+ return UINT2NUM (strlen (RSTRING (value)->ptr)); | |
+} | |
+#endif | |
+ | |
+ | |
VALUE mBase32; | |
+#ifdef TEST | |
+VALUE mBase32Test; | |
+#endif | |
void Init_base32 () | |
{ | |
mBase32 = rb_define_module ("Base32"); | |
rb_define_module_function(mBase32, "decode", b32_decode, 1); | |
rb_define_module_function(mBase32, "encode", b32_encode, 1); | |
+#ifdef TEST | |
+ mBase32Test = rb_define_module ("Base32Test"); | |
+ rb_define_module_function(mBase32Test, "strlen", b32_test_strlen, 1); | |
+#endif | |
} | |
diff --git a/test/base32_test.rb b/test/base32_test.rb | |
index 8bceae9..f2a7b3e 100644 | |
--- a/test/base32_test.rb | |
+++ b/test/base32_test.rb | |
@@ -23,11 +23,15 @@ require 'base32' | |
class TestBase32 < Test::Unit::TestCase | |
def assert_decoding(encoded, plain) | |
- assert_equal(plain, Base32.decode(encoded)) | |
+ decoded = Base32.decode(encoded) | |
+ assert_equal(plain, decoded) | |
+ assert_equal(decoded.size, Base32Test.strlen(decoded)) | |
end | |
def assert_encoding(encoded, plain) | |
- assert_equal(encoded, Base32.encode(plain)) | |
+ actual = Base32.encode(plain) | |
+ assert_equal(encoded, actual) | |
+ assert_equal(actual.size, Base32Test.strlen(actual)) | |
end | |
def assert_encode_and_decode(encoded, plain) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment