Skip to content
This repository has been archived by the owner on May 31, 2020. It is now read-only.

Commit

Permalink
Merge pull request #834 from henne90gen/int_with_base
Browse files Browse the repository at this point in the history
Implementing int(x, base)
  • Loading branch information
eliasdorneles committed Jun 9, 2018
2 parents 8c37903 + 36ef015 commit 80e09f4
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 4 deletions.
25 changes: 23 additions & 2 deletions python/common/org/python/types/Int.java
Expand Up @@ -78,8 +78,29 @@ public Int(org.python.Object[] args, java.util.Map<java.lang.String, org.python.
);
}
}
} else if (args.length > 3) {
throw new org.python.exceptions.NotImplementedError("int() with a base is not implemented");
} else if (args.length == 2) {
try {
org.python.types.Str argStr = (org.python.types.Str) args[0];
if (args[1] instanceof org.python.types.NoneType) {
throw new org.python.exceptions.TypeError("'NoneType' object cannot be interpreted as an integer");
}
org.python.types.Int argInt = (org.python.types.Int) args[1];
int base = (int) argInt.value;
if (base == 0) {
base = 10;
} else if (base < 2 || base > 36) {
if (org.Python.VERSION < 0x03060400) {
throw new org.python.exceptions.ValueError("int() base must be >= 2 and <= 36");
} else {
throw new org.python.exceptions.ValueError("int() base must be >= 2 and <= 36, or 0");
}
}
this.value = java.lang.Integer.parseInt(argStr.value, base);
} catch (java.lang.NumberFormatException e) {
throw new org.python.exceptions.ValueError("invalid literal for int() with base " + args[1] + ": '" + args[0] + "'");
}
} else if (args.length > 2) {
throw new org.python.exceptions.TypeError("int() takes at most 2 arguments (" + args.length + " given)");
}
}

Expand Down
71 changes: 69 additions & 2 deletions tests/datatypes/test_int.py
Expand Up @@ -22,10 +22,77 @@ def test_getattr(self):
print(err)
""")

@expectedFailure
def test_invalid_literal(self):
self.assertCodeExecution("""
int('q', 16)
try:
print(int('q', 16))
except ValueError as err:
print(err)
""")

def test_none(self):
self.assertCodeExecution("""
try:
print(int(None))
except TypeError as err:
print(err)
""")

def test_base_correct(self):
self.assertCodeExecution("""
print(int('a', 16))
print(int('22', 3))
print(int('5', 0))
""")

def test_base_none(self):
self.assertCodeExecution("""
try:
print(int('0', None))
except TypeError as err:
print(err)
""")

def test_base_too_small(self):
self.assertCodeExecution("""
try:
print(int('22', 1))
except ValueError as err:
print(err)
""")

def test_base_negative(self):
self.assertCodeExecution("""
try:
print(int('5', -10))
except ValueError as err:
print(err)
""")

def test_base_too_large(self):
self.assertCodeExecution("""
try:
print(int('5', 100))
except ValueError as err:
print(err)
""")

def test_no_arguments(self):
self.assertCodeExecution("""
print(int())
""")

@expectedFailure
def test_too_many_arguments(self):
self.assertCodeExecution("""
try:
print(int('1', 2, 3, 4))
except TypeError as err:
print(err)
try:
print(int('1', 2, 3, 4, 5))
except TypeError as err:
print(err)
""")


Expand Down

0 comments on commit 80e09f4

Please sign in to comment.