Пример #1
0
        public static void ToXmlReturnsNewXElement()
        {
            var element  = new XElement("Tjoho");
            var fragment = SourceFragment.FromXml(element);

            Assert.AreNotEqual(element, fragment.ToXml());
        }
Пример #2
0
        public static void ToXmlIsRoundtripInvariant()
        {
            var fragmentXml     = Fragment.ToXml();
            var trippedFragment = SourceFragment.FromXml(fragmentXml);

            Assert.AreEqual(Fragment, trippedFragment);
        }
Пример #3
0
        public void Mutate(AbsoluteFilePath file, int iterations)
        {
            var element = SourceFragment.FromString(File.ReadAllText(file.NativePath)).ToXml();

            for (int i = 0; i < iterations; i++)
            {
                Mutate(element);
            }
            File.WriteAllText(file.NativePath, SourceFragment.FromXml(element).ToString());
        }
        public Task <SourceFragment> Copy()
        {
            var    fragment = SourceFragment.FromXml(Element);
            string elementIndent;

            if (Element.TryGetElementIndent(out elementIndent))
            {
                fragment = RemoveIndentFromDescendantNodes(fragment, elementIndent);
            }
            return(Task.FromResult(fragment));
        }
Пример #5
0
        async Task ExtractClassToFile(IElement element, string name, RelativeFilePath fileName)
        {
            var xml = (await element.Copy()).ToXml();

            xml.SetAttributeValue(KeyToName("ux:Class"), name);
            await _project.CreateDocument(fileName, SourceFragment.FromXml(xml));

            // Don't replace original element before new class is loaded
            await _project.Classes
            .WherePerElement(x => x.UxClass().Is(name))
            .Where(x => x.Any())
            .FirstAsync()
            .Timeout(TimeSpan.FromSeconds(2));

            await element.Replace(_ => Task.FromResult(SourceFragment.FromString(string.Format("<{0} />", name))));
        }
Пример #6
0
        public static LiveDocument Open(
            AbsoluteFilePath path,
            IFileSystem fs,
            IObservable <ILookup <ObjectIdentifier, ObjectIdentifier> > metadata,
            BehaviorSubject <Dictionary <ObjectIdentifier, IElement> > idToElement,
            IObserver <IBinaryMessage> mutations,
            IScheduler scheduler)
        {
            IDocument <byte[]> fileOnDisk = new FileWatchingDocument(fs, path);


            var parsingErrors = new BehaviorSubject <Optional <Exception> >(Optional.None());

            var invalidated = new Subject <Unit>();

            var root = new LiveElement(
                file: path,
                metadata: metadata,
                isReadOnly: fileOnDisk.ErrorsDuringLoading.Or(parsingErrors)
                .Select(e => e.HasValue)
                .DistinctUntilChanged()
                .Replay(1).RefCount(),
                invalidated: invalidated,
                mutations: mutations,
                getElement: id =>
                idToElement.Value.TryGetValue(id).Or(Element.Empty));

            Optional <XElement> xElementForSaving = Optional.None <XElement>();

            var allElements = root.Subtree().Replay(1);

            var source = new ReplaySubject <SourceFragment>(1);

            return(new LiveDocument
            {
                _garbage = Disposable.Combine(

                    // Save on internal changes
                    invalidated
                    .Select(_ =>
                {
                    if (xElementForSaving.HasValue)
                    {
                        var sourceFragment = SourceFragment.FromXml(xElementForSaving.Value);
                        source.OnNext(sourceFragment);
                        return Optional.Some(sourceFragment);
                    }
                    return Optional.None();
                })
                    .NotNone()
                    .Throttle(TimeSpan.FromSeconds(0.5), scheduler)
                    .Select(sourceFragment =>
                            Observable.FromAsync(async() =>
                                                 await fileOnDisk.Save(sourceFragment.ToBytes())))
                    .Concat()
                    .Subscribe(),

                    // Load on external changes
                    fileOnDisk.ExternalChanges
                    .ObserveOn(Application.MainThread)
                    .Subscribe(reload =>
                {
                    var sourceFragment = SourceFragment.FromBytes(reload);
                    source.OnNext(sourceFragment);

                    try
                    {
                        var simulatorWasFaulted = parsingErrors.Value.HasValue;

                        var newDocument = sourceFragment.ToXml();
                        parsingErrors.OnNext(Optional.None());

                        xElementForSaving = Optional.None();
                        Console.WriteLine("Reloading " + path + " from disk...");
                        root.UpdateFrom(newDocument);                                                 // no known reasons to throw
                        xElementForSaving = Optional.Some(newDocument);

                        // hack to clear errors from the simulator,
                        // since UpdateFrom() doesn't know that the simulator
                        // have failed and will try to emit incremental updates
                        if (simulatorWasFaulted)
                        {
                            mutations.OnNext(new ReifyRequired());
                        }
                    }
                    catch (Exception e)
                    {
                        parsingErrors.OnNext(e);

                        // hack to get errors from the simulator
                        mutations.OnNext(new ReifyRequired());
                    }
                }),

                    // Share subscription to Eleements
                    allElements.Connect(),

                    // Dispose fileOnDisk when disposed
                    fileOnDisk),

                FilePath = Observable.Return(path),

                Errors = fileOnDisk.Errors.Or(parsingErrors),

                SimulatorIdPrefix = path.NativePath,

                Source = source,

                Root = root,
                Elements = allElements,

                _root = root,
                _path = path,
                _idToElement = idToElement,
            });
        }