public void Equals_CompareCollectionFieldsSet_MatchExpectation()
    {
        var cacheControl1 = new CacheControlHeaderValue();
        var cacheControl2 = new CacheControlHeaderValue();
        var cacheControl3 = new CacheControlHeaderValue();
        var cacheControl4 = new CacheControlHeaderValue();
        var cacheControl5 = new CacheControlHeaderValue();
        var cacheControl6 = new CacheControlHeaderValue();

        cacheControl1.NoCache = true;
        cacheControl1.NoCacheHeaders.Add("PLACEHOLDER2");

        Assert.False(cacheControl1.Equals(null), "Compare with 'null'");

        cacheControl2.NoCache = true;
        cacheControl2.NoCacheHeaders.Add("PLACEHOLDER1");
        cacheControl2.NoCacheHeaders.Add("PLACEHOLDER2");

        CompareValues(cacheControl1 !, cacheControl2, false);

        cacheControl1 !.NoCacheHeaders.Add("PLACEHOLDER1");
        CompareValues(cacheControl1, cacheControl2, true);

        // Since NoCache and Private generate different hash codes, even if NoCacheHeaders and PrivateHeaders
        // have the same values, the hash code will be different.
        cacheControl3.Private = true;
        cacheControl3.PrivateHeaders.Add("PLACEHOLDER2");
        CompareValues(cacheControl1, cacheControl3, false);

        cacheControl4.Private = true;
        cacheControl4.PrivateHeaders.Add("PLACEHOLDER3");
        CompareValues(cacheControl3, cacheControl4, false);

        cacheControl5.Extensions.Add(new NameValueHeaderValue("custom"));
        CompareValues(cacheControl1, cacheControl5, false);

        cacheControl6.Extensions.Add(new NameValueHeaderValue("customN", "customV"));
        cacheControl6.Extensions.Add(new NameValueHeaderValue("custom"));
        CompareValues(cacheControl5, cacheControl6, false);

        cacheControl5.Extensions.Add(new NameValueHeaderValue("customN", "customV"));
        CompareValues(cacheControl5, cacheControl6, true);
    }
        private CacheControlHeaderValue(CacheControlHeaderValue source)
        {
            Debug.Assert(source != null);

            _noCache         = source._noCache;
            _noStore         = source._noStore;
            _maxAge          = source._maxAge;
            _sharedMaxAge    = source._sharedMaxAge;
            _maxStale        = source._maxStale;
            _maxStaleLimit   = source._maxStaleLimit;
            _minFresh        = source._minFresh;
            _noTransform     = source._noTransform;
            _onlyIfCached    = source._onlyIfCached;
            _publicField     = source._publicField;
            _privateField    = source._privateField;
            _mustRevalidate  = source._mustRevalidate;
            _proxyRevalidate = source._proxyRevalidate;

            if (source._noCacheHeaders != null)
            {
                foreach (var noCacheHeader in source._noCacheHeaders)
                {
                    NoCacheHeaders.Add(noCacheHeader);
                }
            }

            if (source._privateHeaders != null)
            {
                foreach (var privateHeader in source._privateHeaders)
                {
                    PrivateHeaders.Add(privateHeader);
                }
            }

            if (source._extensions != null)
            {
                foreach (var extension in source._extensions)
                {
                    Extensions.Add((NameValueHeaderValue)((ICloneable)extension).Clone());
                }
            }
        }
        private CacheControlHeaderValue(CacheControlHeaderValue source)
        {
            Contract.Requires(source != null);

            noCache         = source.noCache;
            noStore         = source.noStore;
            maxAge          = source.maxAge;
            sharedMaxAge    = source.sharedMaxAge;
            maxStale        = source.maxStale;
            maxStaleLimit   = source.maxStaleLimit;
            minFresh        = source.minFresh;
            noTransform     = source.noTransform;
            onlyIfCached    = source.onlyIfCached;
            publicField     = source.publicField;
            privateField    = source.privateField;
            mustRevalidate  = source.mustRevalidate;
            proxyRevalidate = source.proxyRevalidate;

            if (source.noCacheHeaders != null)
            {
                foreach (var noCacheHeader in source.noCacheHeaders)
                {
                    NoCacheHeaders.Add(noCacheHeader);
                }
            }

            if (source.privateHeaders != null)
            {
                foreach (var privateHeader in source.privateHeaders)
                {
                    PrivateHeaders.Add(privateHeader);
                }
            }

            if (source.extensions != null)
            {
                foreach (var extension in source.extensions)
                {
                    Extensions.Add((NameValueHeaderValue)((ICloneable)extension).Clone());
                }
            }
        }