Fix support for other simple types and floating point

Again a silly mistake in sign-extension of (char)0xff to -1.

Signed-off-by: Thiago Macieira <thiago.macieira@intel.com>
diff --git a/src/cborparser.c b/src/cborparser.c
index 6825698..a3883ba 100644
--- a/src/cborparser.c
+++ b/src/cborparser.c
@@ -169,7 +169,9 @@
         switch (descriptor) {
         case FalseValue:
             it->extra = false;
-            // fall through
+            type = CborBooleanType;
+            break;
+
         case TrueValue:
         case NullValue:
         case UndefinedValue:
@@ -180,11 +182,12 @@
             break;
 
         case SimpleTypeInNextByte:
-            it->extra = it->ptr[1];
 #ifndef CBOR_PARSER_NO_STRICT_CHECKS
-            if (it->extra < 32)
+            if ((unsigned char)it->ptr[1] < 32)
                 return CborErrorIllegalSimpleType;
 #endif
+            break;
+
         case 28:
         case 29:
         case 30:
diff --git a/tests/parser/tst_parser.cpp b/tests/parser/tst_parser.cpp
index e648dbe..a632c7b 100644
--- a/tests/parser/tst_parser.cpp
+++ b/tests/parser/tst_parser.cpp
@@ -207,15 +207,20 @@
         } else {
             cbor_value_get_double(it, &val);
         }
-        *parsed += QString::number(val);
-        if (type == CborFloatType)
-            *parsed += 'f';
+        QString number = QString::number(val, 'g', 10);
+        *parsed += number;
+        if (number != "inf" && number != "-inf" && number != "nan") {
+            if (!number.contains('.'))
+                *parsed += '.';
+            if (type == CborFloatType)
+                *parsed += 'f';
+        }
         break;
     }
     case CborHalfFloatType: {
         uint16_t val;
         cbor_value_get_half_float(it, &val);
-        *parsed += QString("__f16(%0)").arg(val, 4, 16, QLatin1Char('0'));
+        *parsed += QString("__f16(0x%0)").arg(val, 4, 16, QLatin1Char('0'));
         break;
     }
 
@@ -299,6 +304,36 @@
     QTest::newRow("-1*2") << raw("\x39\x00\x00") << "-1";
     QTest::newRow("-1*4") << raw("\x3a\0\0\0\0") << "-1";
     QTest::newRow("-1*8") << raw("\x3b\0\0\0\0\0\0\0\0") << "-1";
+
+    QTest::newRow("simple0") << raw("\xe0") << "simple(0)";
+    QTest::newRow("simple19") << raw("\xf3") << "simple(19)";
+    QTest::newRow("false") << raw("\xf4") << "false";
+    QTest::newRow("true") << raw("\xf5") << "true";
+    QTest::newRow("null") << raw("\xf6") << "null";
+    QTest::newRow("undefined") << raw("\xf7") << "undefined";
+    QTest::newRow("simple32") << raw("\xf8\x20") << "simple(32)";
+    QTest::newRow("simple255") << raw("\xf8\xff") << "simple(255)";
+
+    // floating point
+    QTest::newRow("0f16") << raw("\xf9\0\0") << "__f16(0x0000)";
+
+    QTest::newRow("0.f") << raw("\xfa\0\0\0\0") << "0.f";
+    QTest::newRow("0.")  << raw("\xfb\0\0\0\0\0\0\0\0") << "0.";
+    QTest::newRow("-1.f") << raw("\xfa\xbf\x80\0\0") << "-1.f";
+    QTest::newRow("-1.") << raw("\xfb\xbf\xf0\0\0\0\0\0\0") << "-1.";
+    QTest::newRow("16777215.f") << raw("\xfa\x4b\x7f\xff\xff") << "16777215.f";
+    QTest::newRow("16777215.") << raw("\xfb\x41\x6f\xff\xff\xe0\0\0\0") << "16777215.";
+    QTest::newRow("-16777215.f") << raw("\xfa\xcb\x7f\xff\xff") << "-16777215.f";
+    QTest::newRow("-16777215.") << raw("\xfb\xc1\x6f\xff\xff\xe0\0\0\0") << "-16777215.";
+
+    QTest::newRow("qnan_f") << raw("\xfa\x7f\xc0\0\0") << "nan";
+    QTest::newRow("qnan") << raw("\xfb\x7f\xf8\0\0\0\0\0\0") << "nan";
+    QTest::newRow("qnan_f") << raw("\xfa\x7f\xc0\0\0") << "nan";
+    QTest::newRow("snan") << raw("\xfb\x7f\xf8\0\0\0\0\0\0") << "nan";
+    QTest::newRow("-inf_f") << raw("\xfa\xff\x80\0\0") << "-inf";
+    QTest::newRow("-inf") << raw("\xfb\xff\xf0\0\0\0\0\0\0") << "-inf";
+    QTest::newRow("+inf_f") << raw("\xfa\x7f\x80\0\0") << "inf";
+    QTest::newRow("+inf") << raw("\xfb\x7f\xf0\0\0\0\0\0\0") << "inf";
 }
 
 void tst_Parser::fixed()