Implement last part of #277 for JSON backend (still need to add to smile/cbor/protobuf)
diff --git a/release-notes/VERSION b/release-notes/VERSION
index 6492b72..652a695 100644
--- a/release-notes/VERSION
+++ b/release-notes/VERSION
@@ -27,6 +27,7 @@
 #265: `JsonStringEncoder` should allow passing `CharSequence`
  (contributed by Mikael S)
 #276: Add support for serializing using `java.io.DataOutput`
+#277: Add new scalar-array write methods for `int`/`long`/`double` cases
 #280: Add `JsonParser.finishToken()` to force full, non-lazy reading of current token
 #282: Fail to report error for trying to write field name outside Object (root level)
 #285: Add `JsonParser.getText(Writer)`
diff --git a/src/main/java/com/fasterxml/jackson/core/JsonGenerator.java b/src/main/java/com/fasterxml/jackson/core/JsonGenerator.java
index 920f4a7..b8d7a0f 100644
--- a/src/main/java/com/fasterxml/jackson/core/JsonGenerator.java
+++ b/src/main/java/com/fasterxml/jackson/core/JsonGenerator.java
@@ -841,6 +841,54 @@
         writeEndArray();
     }
 
+    /**
+     * Value write method that can be called to write a single
+     * array (sequence of {@link JsonToken#START_ARRAY}, zero or
+     * more {@link JsonToken#VALUE_NUMBER_INT}, {@link JsonToken#END_ARRAY})
+     *
+     * @since 2.8
+     *
+     * @param array Array that contains values to write
+     * @param offset Offset of the first element to write, within array
+     * @param length Number of elements in array to write, from `offset` to `offset + len - 1`
+     */
+    public void writeArray(long[] array, int offset, int length) throws IOException
+    {
+        if (array == null) {
+            throw new IllegalArgumentException("null array");
+        }
+        _verifyOffsets(array.length, offset, length);
+        writeStartArray();
+        for (int i = offset, end = offset+length; i < end; ++i) {
+            writeNumber(array[i]);
+        }
+        writeEndArray();
+    }
+
+    /**
+     * Value write method that can be called to write a single
+     * array (sequence of {@link JsonToken#START_ARRAY}, zero or
+     * more {@link JsonToken#VALUE_NUMBER_FLOAT}, {@link JsonToken#END_ARRAY})
+     *
+     * @since 2.8
+     *
+     * @param array Array that contains values to write
+     * @param offset Offset of the first element to write, within array
+     * @param length Number of elements in array to write, from `offset` to `offset + len - 1`
+     */
+    public void writeArray(double[] array, int offset, int length) throws IOException
+    {
+        if (array == null) {
+            throw new IllegalArgumentException("null array");
+        }
+        _verifyOffsets(array.length, offset, length);
+        writeStartArray();
+        for (int i = offset, end = offset+length; i < end; ++i) {
+            writeNumber(array[i]);
+        }
+        writeEndArray();
+    }
+
     /*
     /**********************************************************
     /* Public API, write methods, text/String values
diff --git a/src/main/java/com/fasterxml/jackson/core/base/GeneratorBase.java b/src/main/java/com/fasterxml/jackson/core/base/GeneratorBase.java
index c3992d7..665ad42 100644
--- a/src/main/java/com/fasterxml/jackson/core/base/GeneratorBase.java
+++ b/src/main/java/com/fasterxml/jackson/core/base/GeneratorBase.java
@@ -5,8 +5,8 @@
 import com.fasterxml.jackson.core.*;
 import com.fasterxml.jackson.core.json.DupDetector;
 import com.fasterxml.jackson.core.json.JsonWriteContext;
+import com.fasterxml.jackson.core.json.PackageVersion;
 import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
-import com.fasterxml.jackson.core.util.VersionUtil;
 
 /**
  * This base class implements part of API that a JSON generator exposes
@@ -114,7 +114,7 @@
      * a simple generated class, with information extracted from Maven project file
      * during build.
      */
-    @Override public Version version() { return VersionUtil.versionFor(getClass()); }
+    @Override public Version version() { return PackageVersion.VERSION; }
 
     @Override
     public Object getCurrentValue() {
diff --git a/src/main/java/com/fasterxml/jackson/core/util/JsonGeneratorDelegate.java b/src/main/java/com/fasterxml/jackson/core/util/JsonGeneratorDelegate.java
index 40cd508..f9c40f4 100644
--- a/src/main/java/com/fasterxml/jackson/core/util/JsonGeneratorDelegate.java
+++ b/src/main/java/com/fasterxml/jackson/core/util/JsonGeneratorDelegate.java
@@ -208,11 +208,30 @@
     public void writeEndObject() throws IOException { delegate.writeEndObject(); }
 
     @Override
-    public void writeFieldName(String name) throws IOException { delegate.writeFieldName(name); }
+    public void writeFieldName(String name) throws IOException {
+        delegate.writeFieldName(name);
+    }
 
     @Override
-    public void writeFieldName(SerializableString name) throws IOException { delegate.writeFieldName(name); }
-    
+    public void writeFieldName(SerializableString name) throws IOException {
+        delegate.writeFieldName(name);
+    }
+
+    @Override
+    public void writeArray(int[] array, int offset, int length) throws IOException {
+        delegate.writeArray(array, offset, length);
+    }
+
+    @Override
+    public void writeArray(long[] array, int offset, int length) throws IOException {
+        delegate.writeArray(array, offset, length);
+    }
+
+    @Override
+    public void writeArray(double[] array, int offset, int length) throws IOException {
+        delegate.writeArray(array, offset, length);
+    }
+
     /*
     /**********************************************************
     /* Public API, write methods, text/String values
diff --git a/src/test/java/com/fasterxml/jackson/core/json/ArrayGenerationTest.java b/src/test/java/com/fasterxml/jackson/core/json/ArrayGenerationTest.java
index d3d2353..dd490b3 100644
--- a/src/test/java/com/fasterxml/jackson/core/json/ArrayGenerationTest.java
+++ b/src/test/java/com/fasterxml/jackson/core/json/ArrayGenerationTest.java
@@ -18,6 +18,18 @@
         _testIntArray(true);
     }
 
+    public void testLongArray() throws Exception
+    {
+        _testLongArray(false);
+        _testLongArray(true);
+    }
+
+    public void testDoubleArray() throws Exception
+    {
+        _testDoubleArray(false);
+        _testDoubleArray(true);
+    }
+
     private void _testIntArray(boolean useBytes) throws Exception {
         // first special cases of 0, 1 values
         _testIntArray(useBytes, 0, 0, 0);
@@ -37,6 +49,44 @@
         _testIntArray(useBytes, 5009, 0, 1);
     }
 
+    private void _testLongArray(boolean useBytes) throws Exception {
+        // first special cases of 0, 1 values
+        _testLongArray(useBytes, 0, 0, 0);
+        _testLongArray(useBytes, 0, 1, 1);
+
+        _testLongArray(useBytes, 1, 0, 0);
+        _testLongArray(useBytes, 1, 1, 1);
+
+        // and then some bigger data
+        _testLongArray(useBytes, 15, 0, 0);
+        _testLongArray(useBytes, 15, 2, 3);
+        _testLongArray(useBytes, 39, 0, 0);
+        _testLongArray(useBytes, 39, 4, 0);
+        _testLongArray(useBytes, 271, 0, 0);
+        _testLongArray(useBytes, 271, 0, 4);
+        _testLongArray(useBytes, 5009, 0, 0);
+        _testLongArray(useBytes, 5009, 0, 1);
+    }
+
+    private void _testDoubleArray(boolean useBytes) throws Exception {
+        // first special cases of 0, 1 values
+        _testDoubleArray(useBytes, 0, 0, 0);
+        _testDoubleArray(useBytes, 0, 1, 1);
+
+        _testDoubleArray(useBytes, 1, 0, 0);
+        _testDoubleArray(useBytes, 1, 1, 1);
+
+        // and then some bigger data
+        _testDoubleArray(useBytes, 15, 0, 0);
+        _testDoubleArray(useBytes, 15, 2, 3);
+        _testDoubleArray(useBytes, 39, 0, 0);
+        _testDoubleArray(useBytes, 39, 4, 0);
+        _testDoubleArray(useBytes, 271, 0, 0);
+        _testDoubleArray(useBytes, 271, 0, 4);
+        _testDoubleArray(useBytes, 5009, 0, 0);
+        _testDoubleArray(useBytes, 5009, 0, 1);
+    }
+
     private void _testIntArray(boolean useBytes, int elements, int pre, int post) throws Exception
     {
         int[] values = new int[elements+pre+post];
@@ -77,4 +127,82 @@
         assertToken(JsonToken.END_ARRAY, p.nextToken());
         p.close();
     }
+
+    private void _testLongArray(boolean useBytes, int elements, int pre, int post) throws Exception
+    {
+        long[] values = new long[elements+pre+post];
+        for (int i = pre, end = pre+elements; i < end; ++i) {
+            values[i] = i-pre;
+        }
+        
+        StringWriter sw = new StringWriter();
+        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+
+        JsonGenerator gen = useBytes ? FACTORY.createGenerator(bytes)
+                : FACTORY.createGenerator(sw);
+
+        gen.writeArray(values, pre, elements);
+        gen.close();
+
+        String json;
+        if (useBytes) {
+            json = bytes.toString("UTF-8");
+        } else {
+            json = sw.toString();
+        }
+
+        JsonParser p = useBytes ? FACTORY.createParser(bytes.toByteArray())
+                : FACTORY.createParser(json);
+        assertToken(JsonToken.START_ARRAY, p.nextToken());
+        for (int i = 0; i < elements; ++i) {
+            if ((i & 1) == 0) { // alternate
+                JsonToken t = p.nextToken();
+                if (t != JsonToken.VALUE_NUMBER_INT) {
+                    fail("Expected number, got "+t+", element #"+i);
+                }
+                assertEquals(i, p.getLongValue());
+            } else {
+                assertEquals(i, p.nextLongValue(-1));
+            }
+        }
+        assertToken(JsonToken.END_ARRAY, p.nextToken());
+        p.close();
+    }
+
+    private void _testDoubleArray(boolean useBytes, int elements, int pre, int post) throws Exception
+    {
+        double[] values = new double[elements+pre+post];
+        for (int i = pre, end = pre+elements; i < end; ++i) {
+            values[i] = i-pre;
+        }
+
+        StringWriter sw = new StringWriter();
+        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+
+        JsonGenerator gen = useBytes ? FACTORY.createGenerator(bytes)
+                : FACTORY.createGenerator(sw);
+
+        gen.writeArray(values, pre, elements);
+        gen.close();
+
+        String json;
+        if (useBytes) {
+            json = bytes.toString("UTF-8");
+        } else {
+            json = sw.toString();
+        }
+
+        JsonParser p = useBytes ? FACTORY.createParser(bytes.toByteArray())
+                : FACTORY.createParser(json);
+        assertToken(JsonToken.START_ARRAY, p.nextToken());
+        for (int i = 0; i < elements; ++i) {
+            JsonToken t = p.nextToken();
+            if (t != JsonToken.VALUE_NUMBER_FLOAT) {
+                fail("Expected floating-point number, got "+t+", element #"+i);
+            }
+            assertEquals((double) i, p.getDoubleValue());
+        }
+        assertToken(JsonToken.END_ARRAY, p.nextToken());
+        p.close();
+    }
 }
diff --git a/src/test/java/com/fasterxml/jackson/core/json/GeneratorFeaturesTest.java b/src/test/java/com/fasterxml/jackson/core/json/GeneratorFeaturesTest.java
new file mode 100644
index 0000000..94cbcd9
--- /dev/null
+++ b/src/test/java/com/fasterxml/jackson/core/json/GeneratorFeaturesTest.java
@@ -0,0 +1,261 @@
+package com.fasterxml.jackson.core.json;
+
+import java.io.*;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+import com.fasterxml.jackson.core.*;
+
+/**
+ * Set of basic unit tests for verifying that the basic generator
+ * functionality works as expected.
+ */
+public class GeneratorFeaturesTest
+    extends com.fasterxml.jackson.core.BaseTest
+{
+    private final JsonFactory JSON_F = new JsonFactory();
+
+    public void testConfigDefaults() throws IOException
+    {
+        JsonGenerator g = JSON_F.createGenerator(new StringWriter());
+        assertFalse(g.isEnabled(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS));
+        assertFalse(g.isEnabled(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN));
+        g.close();
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testConfigOverrides() throws IOException
+    {
+        // but also allow overide
+        JsonGenerator g = JSON_F.createGenerator(new StringWriter());
+        int mask = JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS.getMask()
+                | JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN.getMask();
+        g.overrideStdFeatures(mask, mask);
+        assertTrue(g.isEnabled(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS));
+        assertTrue(g.isEnabled(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN));
+
+        // and for now, also test straight override
+        g.setFeatureMask(0);
+        assertFalse(g.isEnabled(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS));
+        assertFalse(g.isEnabled(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN));
+        g.close();
+    }
+
+    public void testFieldNameQuoting() throws IOException
+    {
+        JsonFactory f = new JsonFactory();
+        // by default, quoting should be enabled
+        _testFieldNameQuoting(f, true);
+        // can disable it
+        f.disable(JsonGenerator.Feature.QUOTE_FIELD_NAMES);
+        _testFieldNameQuoting(f, false);
+        // and (re)enable:
+        f.enable(JsonGenerator.Feature.QUOTE_FIELD_NAMES);
+        _testFieldNameQuoting(f, true);
+    }
+
+    public void testNonNumericQuoting() throws IOException
+    {
+        JsonFactory f = new JsonFactory();
+        // by default, quoting should be enabled
+        _testNonNumericQuoting(f, true);
+        // can disable it
+        f.disable(JsonGenerator.Feature.QUOTE_NON_NUMERIC_NUMBERS);
+        _testNonNumericQuoting(f, false);
+        // and (re)enable:
+        f.enable(JsonGenerator.Feature.QUOTE_NON_NUMERIC_NUMBERS);
+        _testNonNumericQuoting(f, true);
+    }
+
+    /**
+     * Testing for [JACKSON-176], ability to force serializing numbers
+     * as JSON Strings.
+     */
+    public void testNumbersAsJSONStrings() throws IOException
+    {
+        JsonFactory f = new JsonFactory();
+        // by default should output numbers as-is:
+        assertEquals("[1,2,1.25,2.25,3001,0.5,-1]", _writeNumbers(f));        
+
+        // but if overridden, quotes as Strings
+        f.configure(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS, true);
+        assertEquals("[\"1\",\"2\",\"1.25\",\"2.25\",\"3001\",\"0.5\",\"-1\"]",
+                     _writeNumbers(f));
+
+        
+    }
+
+    public void testBigDecimalAsPlain() throws IOException
+    {
+        JsonFactory f = new JsonFactory();
+        BigDecimal ENG = new BigDecimal("1E+2");
+
+        StringWriter sw = new StringWriter();
+        JsonGenerator g = f.createGenerator(sw);
+        g.writeNumber(ENG);
+        g.close();
+        assertEquals("1E+2", sw.toString());
+
+        f.configure(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN, true);
+        sw = new StringWriter();
+        g = f.createGenerator(sw);
+        g.writeNumber(ENG);
+        g.close();
+        assertEquals("100", sw.toString());
+    }
+
+    public void testBigDecimalAsPlainString() throws Exception
+    {
+        JsonFactory f = new JsonFactory();
+        BigDecimal ENG = new BigDecimal("1E+2");
+        f.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);
+        f.enable(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);
+
+        StringWriter sw = new StringWriter();
+        JsonGenerator g = f.createGenerator(sw);
+        g.writeNumber(ENG);
+        g.close();
+        assertEquals(quote("100"), sw.toString());
+
+        // also, as bytes
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        g = f.createGenerator(bos);
+        g.writeNumber(ENG);
+        g.close();
+        assertEquals(quote("100"), bos.toString("UTF-8"));
+    }
+    
+    private String _writeNumbers(JsonFactory f) throws IOException
+    {
+        StringWriter sw = new StringWriter();
+        JsonGenerator g = f.createGenerator(sw);
+    
+        g.writeStartArray();
+        g.writeNumber(1);
+        g.writeNumber(2L);
+        g.writeNumber(1.25);
+        g.writeNumber(2.25f);
+        g.writeNumber(BigInteger.valueOf(3001));
+        g.writeNumber(BigDecimal.valueOf(0.5));
+        g.writeNumber("-1");
+        g.writeEndArray();
+        g.close();
+
+        return sw.toString();
+    }
+
+    // for [core#246]
+    public void testFieldNameQuotingEnabled() throws IOException
+    {
+        // // First, test with default factory, with quoting enabled by default
+        
+        // First, default, with quotes
+        _testFieldNameQuotingEnabled(JSON_F, true, true, "{\"foo\":1}");
+        _testFieldNameQuotingEnabled(JSON_F, false, true, "{\"foo\":1}");
+
+        // then without quotes
+        _testFieldNameQuotingEnabled(JSON_F, true, false, "{foo:1}");
+        _testFieldNameQuotingEnabled(JSON_F, false, false, "{foo:1}");
+
+        // // Then with alternatively configured factory
+
+        JsonFactory f2 = new JsonFactory();
+        f2.disable(JsonGenerator.Feature.QUOTE_FIELD_NAMES);
+
+        _testFieldNameQuotingEnabled(f2, true, true, "{\"foo\":1}");
+        _testFieldNameQuotingEnabled(f2, false, true, "{\"foo\":1}");
+
+        // then without quotes
+        _testFieldNameQuotingEnabled(f2, true, false, "{foo:1}");
+        _testFieldNameQuotingEnabled(f2, false, false, "{foo:1}");
+    }
+
+    private void _testFieldNameQuotingEnabled(JsonFactory f, boolean useBytes,
+            boolean useQuotes, String exp) throws IOException
+    {
+        ByteArrayOutputStream bytes = useBytes ? new ByteArrayOutputStream() : null;
+        StringWriter sw = useBytes ? null : new StringWriter();
+        JsonGenerator gen = useBytes ? f.createGenerator(bytes) : f.createGenerator(sw);
+        if (useQuotes) {
+            gen.enable(JsonGenerator.Feature.QUOTE_FIELD_NAMES);
+        } else {
+            gen.disable(JsonGenerator.Feature.QUOTE_FIELD_NAMES);
+        }
+
+        gen.writeStartObject();
+        gen.writeFieldName("foo");
+        gen.writeNumber(1);
+        gen.writeEndObject();
+        gen.close();
+
+        String json = useBytes ? bytes.toString("UTF-8") : sw.toString();
+        assertEquals(exp, json);
+    }
+
+    public void testChangeOnGenerator() throws IOException
+    {
+        StringWriter w = new StringWriter();
+
+        JsonGenerator g = JSON_F.createGenerator(w);
+        g.enable(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);
+        g.writeNumber(123);
+        g.close();
+        assertEquals(quote("123"), w.toString());
+
+        // but also the opposite
+        w = new StringWriter();
+        g = JSON_F.createGenerator(w);
+        g.enable(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);
+        g.disable(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);
+        g.writeNumber(123);
+        g.close();
+        assertEquals("123", w.toString());
+    }
+
+    /*
+    /**********************************************************
+    /* Helper methods
+    /**********************************************************
+     */
+
+    private void _testFieldNameQuoting(JsonFactory f, boolean quoted)
+        throws IOException
+    {
+        StringWriter sw = new StringWriter();
+        JsonGenerator g = f.createGenerator(sw);
+        g.writeStartObject();
+        g.writeFieldName("foo");
+        g.writeNumber(1);
+        g.writeEndObject();
+        g.close();
+
+        String result = sw.toString();
+        if (quoted) {
+            assertEquals("{\"foo\":1}", result);
+        } else {
+            assertEquals("{foo:1}", result);
+        }
+    }
+    private void _testNonNumericQuoting(JsonFactory f, boolean quoted)
+        throws IOException
+    {
+        StringWriter sw = new StringWriter();
+        JsonGenerator g = f.createGenerator(sw);
+        g.writeStartObject();
+        g.writeFieldName("double");
+        g.writeNumber(Double.NaN);
+        g.writeEndObject();
+        g.writeStartObject();
+        g.writeFieldName("float");
+        g.writeNumber(Float.NaN);
+        g.writeEndObject();
+        g.close();
+	
+        String result = sw.toString();
+        if (quoted) {
+            assertEquals("{\"double\":\"NaN\"} {\"float\":\"NaN\"}", result);
+        } else {
+            assertEquals("{\"double\":NaN} {\"float\":NaN}", result);
+        }
+    }
+}
diff --git a/src/test/java/com/fasterxml/jackson/core/json/TestJsonGeneratorFeatures.java b/src/test/java/com/fasterxml/jackson/core/json/TestJsonGeneratorFeatures.java
deleted file mode 100644
index 671b351..0000000
--- a/src/test/java/com/fasterxml/jackson/core/json/TestJsonGeneratorFeatures.java
+++ /dev/null
@@ -1,221 +0,0 @@
-package com.fasterxml.jackson.core.json;
-
-import java.io.*;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import com.fasterxml.jackson.core.*;
-
-/**
- * Set of basic unit tests for verifying that the basic generator
- * functionality works as expected.
- */
-public class TestJsonGeneratorFeatures
-    extends com.fasterxml.jackson.core.BaseTest
-{
-    private final JsonFactory JSON_F = new JsonFactory();
-
-    public void testConfigDefaults() throws IOException
-    {
-        JsonGenerator g = JSON_F.createGenerator(new StringWriter());
-        assertFalse(g.isEnabled(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS));
-        assertFalse(g.isEnabled(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN));
-        g.close();
-    }
-
-    public void testFieldNameQuoting() throws IOException
-    {
-        JsonFactory jf = new JsonFactory();
-        // by default, quoting should be enabled
-        _testFieldNameQuoting(jf, true);
-        // can disable it
-        jf.disable(JsonGenerator.Feature.QUOTE_FIELD_NAMES);
-        _testFieldNameQuoting(jf, false);
-        // and (re)enable:
-        jf.enable(JsonGenerator.Feature.QUOTE_FIELD_NAMES);
-        _testFieldNameQuoting(jf, true);
-    }
-
-    public void testNonNumericQuoting() throws IOException
-    {
-        JsonFactory jf = new JsonFactory();
-        // by default, quoting should be enabled
-        _testNonNumericQuoting(jf, true);
-        // can disable it
-        jf.disable(JsonGenerator.Feature.QUOTE_NON_NUMERIC_NUMBERS);
-        _testNonNumericQuoting(jf, false);
-        // and (re)enable:
-        jf.enable(JsonGenerator.Feature.QUOTE_NON_NUMERIC_NUMBERS);
-        _testNonNumericQuoting(jf, true);
-    }
-
-    /**
-     * Testing for [JACKSON-176], ability to force serializing numbers
-     * as JSON Strings.
-     */
-    public void testNumbersAsJSONStrings() throws IOException
-    {
-        JsonFactory jf = new JsonFactory();
-        // by default should output numbers as-is:
-        assertEquals("[1,2,1.25,2.25,3001,0.5,-1]", _writeNumbers(jf));        
-
-        // but if overridden, quotes as Strings
-        jf.configure(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS, true);
-        assertEquals("[\"1\",\"2\",\"1.25\",\"2.25\",\"3001\",\"0.5\",\"-1\"]",
-                     _writeNumbers(jf));
-    }
-
-    public void testBigDecimalAsPlain() throws IOException
-    {
-        JsonFactory jf = new JsonFactory();
-        BigDecimal ENG = new BigDecimal("1E+2");
-
-        StringWriter sw = new StringWriter();
-        JsonGenerator g = jf.createGenerator(sw);
-        g.writeNumber(ENG);
-        g.close();
-        assertEquals("1E+2", sw.toString());
-
-        jf.configure(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN, true);
-        sw = new StringWriter();
-        g = jf.createGenerator(sw);
-        g.writeNumber(ENG);
-        g.close();
-        assertEquals("100", sw.toString());
-    }
-
-    public void testBigDecimalAsPlainString() throws Exception
-    {
-        JsonFactory jf = new JsonFactory();
-        BigDecimal ENG = new BigDecimal("1E+2");
-        jf.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);
-        jf.enable(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);
-
-        StringWriter sw = new StringWriter();
-        JsonGenerator g = jf.createGenerator(sw);
-        g.writeNumber(ENG);
-        g.close();
-        assertEquals(quote("100"), sw.toString());
-
-        // also, as bytes
-        ByteArrayOutputStream bos = new ByteArrayOutputStream();
-        g = jf.createGenerator(bos);
-        g.writeNumber(ENG);
-        g.close();
-        assertEquals(quote("100"), bos.toString("UTF-8"));
-    }
-    
-    private String _writeNumbers(JsonFactory jf) throws IOException
-    {
-        StringWriter sw = new StringWriter();
-        JsonGenerator g = jf.createGenerator(sw);
-    
-        g.writeStartArray();
-        g.writeNumber(1);
-        g.writeNumber(2L);
-        g.writeNumber(1.25);
-        g.writeNumber(2.25f);
-        g.writeNumber(BigInteger.valueOf(3001));
-        g.writeNumber(BigDecimal.valueOf(0.5));
-        g.writeNumber("-1");
-        g.writeEndArray();
-        g.close();
-
-        return sw.toString();
-    }
-
-    // for [core#246]
-    public void testFieldNameQuotingEnabled() throws IOException
-    {
-        // // First, test with default factory, with quoting enabled by default
-        
-        // First, default, with quotes
-        _testFieldNameQuotingEnabled(JSON_F, true, true, "{\"foo\":1}");
-        _testFieldNameQuotingEnabled(JSON_F, false, true, "{\"foo\":1}");
-
-        // then without quotes
-        _testFieldNameQuotingEnabled(JSON_F, true, false, "{foo:1}");
-        _testFieldNameQuotingEnabled(JSON_F, false, false, "{foo:1}");
-
-        // // Then with alternatively configured factory
-
-        JsonFactory JF2 = new JsonFactory();
-        JF2.disable(JsonGenerator.Feature.QUOTE_FIELD_NAMES);
-
-        _testFieldNameQuotingEnabled(JF2, true, true, "{\"foo\":1}");
-        _testFieldNameQuotingEnabled(JF2, false, true, "{\"foo\":1}");
-
-        // then without quotes
-        _testFieldNameQuotingEnabled(JF2, true, false, "{foo:1}");
-        _testFieldNameQuotingEnabled(JF2, false, false, "{foo:1}");
-    }
-
-    private void _testFieldNameQuotingEnabled(JsonFactory jf, boolean useBytes,
-            boolean useQuotes, String exp) throws IOException
-    {
-        ByteArrayOutputStream bytes = useBytes ? new ByteArrayOutputStream() : null;
-        StringWriter sw = useBytes ? null : new StringWriter();
-        JsonGenerator gen = useBytes ? jf.createGenerator(bytes) : jf.createGenerator(sw);
-        if (useQuotes) {
-            gen.enable(JsonGenerator.Feature.QUOTE_FIELD_NAMES);
-        } else {
-            gen.disable(JsonGenerator.Feature.QUOTE_FIELD_NAMES);
-        }
-
-        gen.writeStartObject();
-        gen.writeFieldName("foo");
-        gen.writeNumber(1);
-        gen.writeEndObject();
-        gen.close();
-
-        String json = useBytes ? bytes.toString("UTF-8") : sw.toString();
-        assertEquals(exp, json);
-    }
-    
-    /*
-    /**********************************************************
-    /* Helper methods
-    /**********************************************************
-     */
-
-    private void _testFieldNameQuoting(JsonFactory jf, boolean quoted)
-        throws IOException
-    {
-        StringWriter sw = new StringWriter();
-        JsonGenerator g = jf.createGenerator(sw);
-        g.writeStartObject();
-        g.writeFieldName("foo");
-        g.writeNumber(1);
-        g.writeEndObject();
-        g.close();
-
-        String result = sw.toString();
-        if (quoted) {
-            assertEquals("{\"foo\":1}", result);
-        } else {
-            assertEquals("{foo:1}", result);
-        }
-    }
-    private void _testNonNumericQuoting(JsonFactory jf, boolean quoted)
-        throws IOException
-    {
-        StringWriter sw = new StringWriter();
-        JsonGenerator g = jf.createGenerator(sw);
-        g.writeStartObject();
-        g.writeFieldName("double");
-        g.writeNumber(Double.NaN);
-        g.writeEndObject();
-        g.writeStartObject();
-        g.writeFieldName("float");
-        g.writeNumber(Float.NaN);
-        g.writeEndObject();
-        g.close();
-	
-        String result = sw.toString();
-        if (quoted) {
-            assertEquals("{\"double\":\"NaN\"} {\"float\":\"NaN\"}", result);
-        } else {
-            assertEquals("{\"double\":NaN} {\"float\":NaN}", result);
-        }
-    }
-}